2013-11-26 3 views
15

Мне нужно проанализировать сложность некоторых алгоритмов в Java. Для этого я планирую предоставить большое количество вкладов и измерить время, затраченное на реализацию Java. Каков наиболее точный и точный способ проверки времени между некоторыми строками кода? Мне нужна точность в миллисекундах ...Как измерить время, затраченное кодом Java?

+0

Не совсем! Я искал что-то вроде System.nanoTime(), однако вышеупомянутый вопрос касался некоторого формального бенчмаркинга. Это требует некоторого глубокого чтения, которое может не помочь случайному читателю. –

+2

@MangatRai: «случайный читатель» опасен в этой области: почти все случаи, когда вы действительно нуждаетесь в «проверке времени между некоторыми строками кода», сильно зависят от того, что обсуждается в этом вопросе. Без этого вы получите бесполезные или вводящие в заблуждение данные и сделаете неправильные решения. –

+1

Какой ваш вопрос связан с временной сложностью? Понимаете ли вы, что временная сложность - это статический анализ, тогда как вы запрашиваете сравнительный анализ производительности? – Val

ответ

15

Вы можете получить разрешение наносекунды, даже используя System.nanoTime().

Однако, вы можете рассмотреть точки в следующем:

How do I write a correct micro-benchmark in Java?

+1

Вопрос, который вы упомянули, хорош. Я прочитаю его полностью ... –

4

System.nanoTime() Используйте или System.currentTimeMillis(), чтобы получить как время начала и окончания вашего кода. Имейте в виду, что микро-тесты измеряют только основные аспекты производительности JVM. Помните о фазе прогрева для JVM, после чего начинается JIT.

+1

Я предлагаю использовать System.nanoTime() http://stackoverflow.com/questions/11591000/system-currentimeinmillis-vs-system-nanotime – SpringLearner

1
long start = System.currentTimeMillis(); 
// your code 
long end = System.currentTimeMillis(); 
long diff = end-start; 

или

long start = System.nanoTime(); 
// your code 
long end = System.nanoTime(); 
long diff = end-start; 
long diffInMillis = diff/1000000; 
+3

Я предлагаю не использовать currenttimemillis для того, чтобы знать время выполнения – SpringLearner

5

Скажем, у вас есть конкретный метод, который вы хотели бы поставить под микроскопом. Вы можете сделать это следующим образом:

long time1 = System.nanoTime(); 
thatMethod(); 
long time2 = System.nanoTime(); 
long timeTaken = time2 - time1; 
System.out.println("Time taken " + timeTaken + " ns"); 

компьютеры очень быстро, так что может случиться так, что разница во времени при использовании getTimeMillis() возможно ноль. Следовательно, используйте nanoTime()

Вы также можете использовать Caliper. У них есть видео, чтобы начать. Кроме того, внимательно прочитайте ответ, на который указывает creichen. В нем много замечательных вещей.

2
long startTime = System.currentTimeMillis(); 

//code lines whose time you want to calculate 

long endTime = System.currentTimeMillis(); 
System.out.println("Took "+(endTime - startTime) + " ms"); 
+0

Я так искушаюсь '-1', но тогда .. пожалуйста, отформатируйте свой код. Не указывайте, что уже было сказано. –

5

Используйте библиотеку, такую ​​как Speed4j. Это должно не только оценивать вызовы, но также предоставлять статистику в журналах, а также вы можете видеть их удаленно через JMX. Лучше использовать такую ​​библиотеку, а не размещать System.current .. вызовы по всему коду.

+4

+1 для добавления чего-то нового =) –

+0

круто! действительно хорошее дополнение –

Смежные вопросы