Подтвердить что ты не робот

Как я могу проверить время выполнения метода в java?

У меня есть программа, которую я сам написал в java, но я хочу проверить время выполнения метода и получить тайминги для определенных методов. Мне было интересно, возможно ли это, возможно, каким-то образом подключаемый модуль eclipse? или, возможно, вставить какой-то код?

Я вижу, это довольно маленькая программа, не более 1500 строк, что было бы лучше выделенного инструмента или System.currentTimeMillis()?

Большое спасибо

4b9b3361

Ответ 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