Как я могу проверить время выполнения метода в java?
У меня есть программа, которую я сам написал в java, но я хочу проверить время выполнения метода и получить тайминги для определенных методов. Мне было интересно, возможно ли это, возможно, каким-то образом подключаемый модуль eclipse? или, возможно, вставить какой-то код?
Я вижу, это довольно маленькая программа, не более 1500 строк, что было бы лучше выделенного инструмента или System.currentTimeMillis()
?
Большое спасибо
Ответы
Ответ 1
Помимо использования профилировщика, простой способ получить то, что вы хотите, это следующее:
public class SomeClass{
public void somePublicMethod()
{
long startTime = System.currentTimeMillis();
someMethodWhichYouWantToProfile();
long endTime = System.currentTimeMillis();
System.out.println("Total execution time: " + (endTime-startTime) + "ms");
}
}
Ответ 2
Если узкое место достаточно велико, чтобы его можно было наблюдать с помощью профилировщика, используйте профилировщик.
Если вам нужна более высокая точность, лучшим способом измерения небольшого фрагмента кода является использование инфраструктуры микрообъектов Java, например OpenJDK JMH или Google Caliper. Я считаю, что они так же просты в использовании, как JUnit, и не только вы получите более точные результаты, но вы получите опыт сообщества, чтобы сделать все правильно.
Выполняет микрозапись JMH для измерения времени выполнения Math.log()
:
private double x = Math.PI;
@Benchmark
public void myBenchmark() {
return Math.log(x)
}
Использование currentMillis()
и nanoTime()
для измерения имеет множество ограничений:
- У них есть латентность (они также требуют времени для выполнения), которые смещают ваши измерения.
- У них ограниченная точность ОЧЕНЬ, это означает, что вы можете мешать вещам от 26 нс до 26 нс в Linux и 300 или около того в Windows описано здесь
- Фаза прогрева не принимается во внимание, делая ваши измерения колеблющимися LOT.
Методы currentMillis()
и nanoTime()
в Java могут быть полезны, но должны использоваться с EXTREME CAUTION или вы можете получить неправильные ошибки измерений как это, где порядок измеренных фрагментов влияет на измерения или https://shipilev.net/#benchmarking
Ответ 3
Для быстрых и грязных измерений времени измерения не используйте время настенных часов (System.currentTimeMillis()
). Предпочитайте System.nanoTime()
вместо:
public static void main(String... ignored) throws InterruptedException {
final long then = System.nanoTime();
TimeUnit.SECONDS.sleep(1);
final long millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - then);
System.out.println("Slept for (ms): " + millis); // = something around 1000.
}
Ответ 4
Вы должны использовать профилировщик, например
Они легко интегрируются с любой IDE и показывают любую деталь, в которой вы нуждаетесь.
Конечно, эти инструменты сложны и предназначены для использования в сложных программах, если вам нужны только некоторые простые тесты, я предлагаю вам использовать System.currentTimeMillis()
или System.nanoTime()
и вычислять delta миллисекунд между вызовами самостоятельно.
Ответ 5
Вы можете добавить этот код, и он расскажет вам, как долго выполнялся этот метод.
long millisecondsStart = System.currentTimeMillis();
executeMethod();
long timeSpentInMilliseconds = System.currentTimeMillis() - millisecondsStart;
Ответ 6
Использование профилировщика лучше, потому что вы можете узнать среднее время выполнения и узкие места в вашем приложении.
Я использую VisualVM. скользкий и простой.
Ответ 7
Jprofiler и yourkit хороши, но стоят денег.
Существует бесплатный плагин для eclispe под названием TPTP (платформа тестирования и производительности), который может дать вам время выполнения кода. Вот учебник, в котором рассказывается о быстром поиске google. http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html
Ответ 8
Google Guava имеет секундомер, делает вещи простыми и легкими.
Stopwatch stopwatch = Stopwatch.createStarted();
myFunctionCall();
LOGGER.debug("Time taken by myFunctionCall: " + stopwatch.stop());
Ответ 9
Другое решение, созданное на заказ, может основываться на следующем сообщении: http://www.mkyong.com/spring/spring-aop-examples-advice/
У вас также есть возможность использовать утилиты для мониторинга приложений и snmp. Если вам нужно регулярно "время" использовать свои методы в рабочей среде, вы, вероятно, должны рассмотреть возможность использования одного из тех инструментов SNMP