Подтвердить что ты не робот

Библиотека синхронизации производительности Java

Я часто просматриваю код в паре System.nanoTime(), чтобы синхронизировать его. Что-то вроде:

long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;

Есть ли какая-нибудь хорошая библиотека времени, которая помогает с этой проблемой? Также будет принят домашний код.

Н.Б.

Профилировщик здесь не является решением, так как я хочу использовать некоторые временные ограничения в своих модульных тестах, поэтому я хочу использовать методы синхронизации программно.

4b9b3361

Ответ 1

Я не использовал его, но недавно встретил perf4j.

Ответ 2

Не прямой ответ на ваш вопрос, но я также часто использую этот совет ко времени моего кода и просто написал следующий простой шаблон Eclipse → Surround With:

long startTime = System.currentTimeMillis();
${line_selection}${cursor}
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("Total time = " + totalTime);
System.out.println();

Ответ 3

JUnit 4 получил встроенную функцию временного ограничения.

@Test (таймаут = Х)

должен сделать трюк. X - это максимальное количество миллисекунд, которое разрешено запустить методу.

Ответ 4

есть StopWatch от commons-lang, он также позволяет разделить таймер.

Ответ 5

Если вы используете Spring, у вас уже есть класс, называемый StopWatch в вашем классеpath для этого предложения.

Ответ 6

Пробовал JPerf?

Ответ 7

Какую помощь вы ищете с этой проблемой? У вас есть основы. Вы получаете прошедшее время в наносекундах, точно в зависимости от того, на что способна базовая ОС/аппаратное обеспечение.

Также... и я знаю, что вы не сказали профилеров... но у меня был выдающийся опыт работы с YourKit. Он предоставляет API, который вы можете использовать для управления профилированием извне. В зависимости от вашей конкретной проблемы, это может стоить взглянуть.

Ответ 8

JETM - хорошая библиотека для этого. Он также может содержать минуты, макс и средние значения, а также может генерировать информативные графики.

Ответ 10

ручной работы...

import static java.lang.System.nanoTime;

/**
 * For testing / debug purposes.
 * 
 * <pre>
 *  private Stopwatch stopwatch = new Stopwatch();
 *  ...
 *  public void method1() {
 *      stopwatch.reset();
 *      for (...) {
 *          ...
 *          stopwatch.start();
 *          operation1();
 *          stopwatch.stop();
 *          ...
 *      }
 *      System.out.println("operation 1 max timing is " + stopwatch.getMaxLapTime());
 *  }
 *  ...
 *  public void method2() {
 *      stopwatch.reset();
 *      for (...) {
 *          ...
 *          stopwatch.start();
 *          operation2();
 *          stopwatch.stop();
 *          ...
 *      }
 *      System.out.println("operation 2 max timing is " + stopwatch.getMaxLapTime());
 *  }
 * </pre>
 * 
 * @author Mykhaylo Adamovych
 */
public class Stopwatch {
    protected long totalTime;
    protected long maxLapTime;
    protected long minLapTime = Long.MAX_VALUE;
    protected long lapsCount;
    protected long lastThreshold;

    /**
     * Human readable time in seconds
     * 
     * @param nanoTime
     * @return time in seconds
     */
    public static final String toSeconds(long nanoTime) {
        return String.format("%.9f", nanoTime / 1000000000.0);
    }

    public long getAverageLapTime() {
        if (lapsCount == 0)
            return 0;
        return totalTime / lapsCount;
    }

    public long getMaxLapTime() {
        return maxLapTime;
    }

    public long getMinLapTime() {
        return minLapTime;
    }

    public long getTotalTime() {
        return totalTime;
    }

    /**
     * Returns last lap time, process statistic.
     */
    public long lapTime() {
        return processLapTime();
    }

    private long processLapTime() {
        if (lastThreshold == 0)
            throw new IllegalStateException("Stopwatch is stopped.");
        final long now = nanoTime();
        final long lapTime = now - lastThreshold;
        lapsCount++;
        totalTime += lapTime;
        if (lapTime > maxLapTime)
            maxLapTime = lapTime;
        if (lapTime < minLapTime)
            minLapTime = lapTime;
        lastThreshold = nanoTime();
        return lapTime;
    }

    /**
     * Resets statistic and starts.
     */
    public void reset() {
        totalTime = 0;
        maxLapTime = 0;
        minLapTime = Long.MAX_VALUE;
        lapsCount = 0;
        start();
    }

    /**
     * Starts time watching.
     */
    public void start() {
        lastThreshold = nanoTime();
    }

    /**
     * Suspends time watching, returns last lap time.
     */
    public long stop() {
        final long lapTime = processLapTime();
        lastThreshold = 0;
        return lapTime;
    }
}

Ответ 11

Что-то новое на рынке JMH. Это сделано под эгидой проекта openjdk.

Ответ 12

Я только начал использовать Java Simon (ранее в Google Code), и это кажется потрясающим! Простой набор секундомеров и счетчиков с несколькими зависимостями.