Ответ 1
Я не использовал его, но недавно встретил perf4j.
Я часто просматриваю код в паре System.nanoTime(), чтобы синхронизировать его. Что-то вроде:
long start = System.nanoTime();
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
Есть ли какая-нибудь хорошая библиотека времени, которая помогает с этой проблемой? Также будет принят домашний код.
Н.Б.
Профилировщик здесь не является решением, так как я хочу использовать некоторые временные ограничения в своих модульных тестах, поэтому я хочу использовать методы синхронизации программно.
Я не использовал его, но недавно встретил perf4j.
Не прямой ответ на ваш вопрос, но я также часто использую этот совет ко времени моего кода и просто написал следующий простой шаблон Eclipse → Surround With:
long startTime = System.currentTimeMillis();
${line_selection}${cursor}
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("Total time = " + totalTime);
System.out.println();
JUnit 4 получил встроенную функцию временного ограничения.
@Test (таймаут = Х)
должен сделать трюк. X - это максимальное количество миллисекунд, которое разрешено запустить методу.
есть StopWatch от commons-lang, он также позволяет разделить таймер.
Если вы используете Spring, у вас уже есть класс, называемый StopWatch в вашем классеpath для этого предложения.
Пробовал JPerf?
Какую помощь вы ищете с этой проблемой? У вас есть основы. Вы получаете прошедшее время в наносекундах, точно в зависимости от того, на что способна базовая ОС/аппаратное обеспечение.
Также... и я знаю, что вы не сказали профилеров... но у меня был выдающийся опыт работы с YourKit. Он предоставляет API, который вы можете использовать для управления профилированием извне. В зависимости от вашей конкретной проблемы, это может стоить взглянуть.
JETM - хорошая библиотека для этого. Он также может содержать минуты, макс и средние значения, а также может генерировать информативные графики.
И помимо чтения вики на этом сайте, я рекомендую прочитать:
ручной работы...
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;
}
}
Что-то новое на рынке JMH. Это сделано под эгидой проекта openjdk.
Я только начал использовать Java Simon (ранее в Google Code), и это кажется потрясающим! Простой набор секундомеров и счетчиков с несколькими зависимостями.