#java #benchmarking
#java #сравнительный анализ
Вопрос:
Я анализирую файл с несколькими действиями и хочу измерить время, необходимое для выполнения этих действий.
Каков наилучший способ сделать это и вывести время?
Ответ №1:
Обновление: Если вы не против использования внешних библиотек и используете JDK 5 , в Google Guava есть секундомер, который использует System.nanoTime()
. Это не связано с абсолютным системным временем или временем настенных часов, а вместо этого полезно только при вычислении прошедшего времени, но это именно то, что вы хотите.
В противном случае вы можете использовать System.currentTimeMillis()
который возвращает текущее системное время в миллисекундах как длинное целое число.
long start = System.currentTimeMillis();
// ... perform operations ...
long time = System.currentTimeMillis() - start;
System.out.println("Operation took " time "ms");
Синхронизация краткосрочных операций может быть очень сложной задачей, особенно когда вы запускаете их в цикле, чтобы амортизировать его в течение нескольких запусков. Вы находитесь во власти планировщика задач операционной системы и планировщика внутренних потоков Java.
Чтобы смягчить эти проблемы, усредните время для нескольких запусков и, по возможности, переместите операции вывода консоли за пределы синхронизации. Просто имейте в виду, что вы не получите точных чисел.
Комментарии:
1. 1 хороший момент о подводных камнях. Профилировщикам часто требуется этап калибровки, чтобы компенсировать это.
Ответ №2:
Именно так вы обычно измеряете время выполнения:
long start = System.currentTimeMillis();
//perform action
System.out.println("It took " (System.currentTimeMillis() - start) "ms");
Ответ №3:
Не уверен, что вы подразумеваете под действиями, но если вы хотите посмотреть, сколько времени занимает фрагмент кода:
long start = System.nanoTime();
//Your code here
long timeElapsed = System.nanoTime() - start;
System.out.println(timeElapsed);
Это выведет количество затраченных наносекунд
Ответ №4:
Я бы использовал профилировщик моей IDE или jvisualvm
.
Ответ №5:
long start=System.currentTimeMillis();
//your action code
long end=System.currentTimeMillis();
int durationInMillis=end-start;