Синхронизация действия

#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;