Самый чистый способ - написать свою собственную агрегатную функцию, чтобы сделать это, поскольку он будет обрабатывать это наиболее чисто (обрабатывает подсезонное разрешение и т. д.).
На самом деле, этот вопрос был задан (и ответил) на asktom.oracle.com a назад (статья содержит исходный код).
Всегда существует старомодный путь:
long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();
long duration = (endTime - startTime); //divide by 1000000 to get milliseconds.
Как "skaffman" сказал, используйте AOP, ИЛИ можно использовать переплетение байт-кода времени выполнения, точно так же, как инструменты покрытия метода модульного теста используют для прозрачного добавления информации о синхронизации к вызванным методам.
можно посмотреть на код, используемый инструментами инструментов с открытым исходным кодом как Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Другой инструмент покрытия с открытым исходным кодом http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
, Если Вам в конечном счете удается сделать то, что Вы излагаете в. совместно используйте его назад с сообществом здесь с Вашей задачей Ant / банки.
long startTime = System.currentTimeMillis();
// code goes here
long finishTime = System.currentTimeMillis();
long elapsedTime = finishTime - startTime; // elapsed time in milliseconds
Если Вы хотите тактовое стеной время
long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;
Используйте профилировщика (JProfiler, Профилировщик Netbeans, Визуальный VM, Профилировщик Eclipse, и т.д.). Вы получите самые точные результаты и наименее навязчивы. Они используют встроенный механизм JVM для профилирования, которое может также дать Вам дополнительную информацию как отслеживания стека, пути выполнения и более всесторонние результаты при необходимости.
При использовании полностью интегрированного профилировщика, это умирающим образом тривиально для профилирования метода. Щелкните правой кнопкой, Профилировщик-> Добавляют к Корневым Методам. Тогда выполните профилировщика точно так же, как Вы делали тестовый прогон или отладчик.
Это, вероятно, не то, что Вы хотели, чтобы я сказал, но это - хорошее использование AOP. Хлещите перехватчик прокси вокруг своего метода и сделайте синхронизацию там.
, какой, почему и как из AOP скорее выходит за рамки этого ответа, к сожалению, но это - то, как я, вероятно, сделал бы это.
Редактирование: Вот ссылка к AOP Spring для запущения Вас, если Вы увлечены. Это - самая доступная реализация AOP, с которым Iive сталкиваются для Java.
кроме того, учитывая всех очень простые предложения else, я должен добавить, что AOP для того, когда Вы не хотите, чтобы материал как синхронизация вторгся в Ваш код. Но во многих случаях, такой простой и легкий подход прекрасен.
Существует несколько способов сделать это. Я обычно отступаю только к использованию чего-то вроде этого:
long start = System.currentTimeMillis();
// ... do something ...
long end = System.currentTimeMillis();
или то же самое с System.nanoTime ();
Для чего-то больше на стороне сравнительного тестирования вещей, кажется, также существует этот: http://jetm.void.fm/ Никогда не пробовал его все же.
Мы используем AspectJ и аннотации Java с этой целью. Если мы должны знать ко времени выполнения для метода, мы простой аннотируем его. Больше усовершенствованной версии могло использовать собственный уровень журнала, который может, включил и отключил во времени выполнения.
public @interface Trace {
boolean showParameters();
}
@Aspect
public class TraceAspect {
[...]
@Around("tracePointcut() && @annotation(trace) && !within(TraceAspect)")
public Object traceAdvice ( ProceedingJintPoint jP, Trace trace ) {
Object result;
// initilize timer
try {
result = jp.procced();
} finally {
// calculate execution time
}
return result;
}
[...]
}
Просто маленькое скручивание, если Вы не используете инструменты и хотите к методам времени с низким временем выполнения: выполняйте его много раз, каждый раз удваивая количество раз, это выполняется, пока Вы не достигаете секунды, или около этого. Таким образом время Вызова к System.nanoTime и т.д, ни точность System.nanoTime действительно влияют на результат очень.
int runs = 0, runsPerRound = 10;
long begin = System.nanoTime(), end;
do {
for (int i=0; i<runsPerRound; ++i) timedMethod();
end = System.nanoTime();
runs += runsPerRound;
runsPerRound *= 2;
} while (runs < Integer.MAX_VALUE / 2 && 1000000000L > end - begin);
System.out.println("Time for timedMethod() is " +
0.000000001 * (end-begin) / runs + " seconds");
, Конечно, протесты об использовании настенных часов применяются: влияния JIT-компиляции, несколько потоков / обрабатывают и т.д. Таким образом, необходимо сначала выполнить метод много из времен сначала, такой, что JIT-компилятор делает свою работу, и затем повторяет этот тест многократно и занимает самое низкое время выполнения.
Я в основном делаю изменения этого, но рассматривающий, как компиляция горячей точки работает, если Вы хотите получить точные результаты, необходимо вывести первые несколько измерений и удостовериться, что Вы используете метод в реальном мире (читайте специализированный), приложение.
, Если JIT решает скомпилировать его, Ваши числа будут варьироваться в большой степени. поэтому просто будьте знающие
Я иду с простым ответом. Работы для меня.
long startTime = System.currentTimeMillis();
doReallyLongThing();
long endTime = System.currentTimeMillis();
System.out.println("That took " + (endTime - startTime) + " milliseconds");
Это работает вполне хорошо. Разрешение очевидно только к миллисекунде, можно добиться большего успеха с System.nanoTime (). Существуют некоторые ограничения обоим (части расписания операционной системы, и т.д.), но это работает вполне прилично.
Среднее число через несколько выполнений (больше лучше) и Вы получите достойную идею.
Для java 8 +, другое возможное решение (более общий, func-стиль и без аспектов) могло состоять в том, чтобы создать некоторый код принятия служебного метода в качестве параметра
public static <T> T timed (String description, Consumer<String> out, Supplier<T> code) {
final LocalDateTime start = LocalDateTime.now ();
T res = code.get ();
final long execTime = Duration.between (start, LocalDateTime.now ()).toMillis ();
out.accept (String.format ("%s: %d ms", description, execTime));
return res;
}
, И код вызова мог быть чем-то как этот:
public static void main (String[] args) throws InterruptedException {
timed ("Simple example", System.out::println, Timing::myCode);
}
public static Object myCode () {
try {
Thread.sleep (1500);
} catch (InterruptedException e) {
e.printStackTrace ();
}
return null;
}