- Как я могу получить время выполнения метода?
- Существует ли
Timer
служебный класс для таких вещей, как время, сколько времени занимает задача и т. Д.?
Большинство запросов в Google возвращают результаты для таймеров, которые планируют потоки и задачи, а это не то, что мне нужно.
java
timing
execution-time
Огрский псалом33
источник
источник
Instant
класса: stackoverflow.com/a/30975902/1216775Ответы:
Всегда есть старомодный способ:
источник
Я иду с простым ответом. Работает для меня.
Это работает довольно хорошо. Разрешение очевидно только с точностью до миллисекунды, вы можете сделать лучше с System.nanoTime (). Есть некоторые ограничения для обоих (срезы расписания операционной системы и т. Д.), Но это работает довольно хорошо.
В среднем за пару пробежек (чем больше, тем лучше), и вы получите достойную идею.
источник
nanoTime
гарантированно будет по крайней мере столь же решительным, какcurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
является то, что это фактическая временная метка, и она также может быть использована для регистрации времени начала / окончания, тогда какnanoTime
«может использоваться только для измерения прошедшего времени и не связана с каким-либо другим понятием системного или настенного времени. «.Давайте, ребята! Никто не упомянул способ Гуавы сделать это (что, возможно, потрясающе):
Приятно то, что Stopwatch.toString () делает хорошую работу по выбору единиц времени для измерения. Т.е. если значение мало, оно выдаст 38 нс, если оно длинное, то покажет 5 м 3 с
Еще приятнее
Примечание: Google Guava требует Java 1.6+
источник
start()
несколько раз подряд (то же самое дляstop()
).Используя Instant и Duration из нового API Java 8,
выходы,
источник
Duration.between(start, end).getSeconds()
.Duration
также есть методы для преобразования в другие единицы времени, например,toMillis()
которые преобразуются в миллисекунды.Собрались все возможные пути вместе в одном месте.
Свидание
Система. currentTimeMillis ()
Удобочитаемый формат
Guava: Google Stopwatch JAR «Цель секундомера - измерить прошедшее время в наносекундах.
Apache Commons Lang JAR « StopWatch предоставляет удобный API для таймингов.
ДЖОДА- ВРЕМЯ
Java date time API из Java 8 «Объект Duration представляет период времени между двумя объектами Instant .
Spring Framework предоставляетслужебный класс StopWatch для измерения прошедшего времени в Java.
Вывод:
источник
Используйте профилировщик (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler и т. Д.). Вы получите самые точные результаты и наименее навязчивый. Они используют встроенный механизм JVM для профилирования, который также может дать вам дополнительную информацию, такую как трассировки стека, пути выполнения и более полные результаты, если это необходимо.
При использовании полностью интегрированного профилировщика профилировать метод очень просто. Щелкните правой кнопкой мыши, Profiler -> Добавить к корневым методам. Затем запустите профилировщик так же, как вы выполняли тестовый прогон или отладчик.
источник
Это, вероятно, не то, что вы хотели, чтобы я сказал, но это хорошее использование АОП. Обведите прокси-перехватчик вокруг вашего метода и определите время там.
К сожалению, вопрос «что, почему и как» в АОП выходит за рамки этого ответа, но я бы так и сделал.
Изменить: Вот ссылка на Spring AOP, чтобы начать, если вы заинтересованы. Это самая доступная реализация AOP, которую Iive встретил для Java.
Кроме того, учитывая очень простые предложения других, я должен добавить, что AOP предназначен для случаев, когда вы не хотите, чтобы такие вещи, как синхронизация, вторгались в ваш код. Но во многих случаях такой простой и легкий подход вполне подходит.
источник
System.currentTimeMillis();
НЕ является хорошим подходом для измерения производительности ваших алгоритмов. Он измеряет общее время, которое вы испытываете, когда пользователь смотрит на экран компьютера. Он также включает время, затрачиваемое всем, что работает на вашем компьютере в фоновом режиме. Это может иметь огромное значение, если на вашей рабочей станции запущено много программ.Правильный подход использует
java.lang.management
пакет.С http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking веб-сайта:
getCpuTime()
Метод дает вам сумму из них:источник
С Java 8 вы можете сделать что-то подобное с любыми обычными методами :
с TimeIt, как:
С помощью этого метода вы можете легко измерять время в любом месте кода, не нарушая его. В этом простом примере я просто печатаю время. Можете ли вы добавить переключатель для TimeIt, например, чтобы печатать только время в DebugMode или что-то еще.
Если вы работаете с Function, вы можете сделать что-то вроде этого:
источник
Также мы можем использовать класс StopWatch Apache Commons для измерения времени.
Образец кода
источник
Небольшой поворот, если вы не используете инструментарий и хотите использовать методы с малым временем выполнения: выполняйте его много раз, каждый раз удваивая число выполнений, пока не достигнете секунды, или около того. Таким образом, время обращения к System.nanoTime и т. Д., А также точность System.nanoTime не сильно влияют на результат.
Конечно, действуют предостережения относительно использования настенных часов: влияние JIT-компиляции, несколько потоков / процессов и т. Д. Таким образом, сначала вам нужно сначала выполнить метод много раз, чтобы JIT-компилятор выполнял свою работу, а затем повторите этот тест несколько раз и возьмите наименьшее время выполнения.
источник
Для этой цели мы используем аннотации AspectJ и Java. Если нам нужно узнать время выполнения метода, мы просто аннотируем его. Более продвинутая версия может использовать собственный уровень журнала, который можно включать и отключать во время выполнения.
источник
JEP 230: набор микробенчмарков
К вашему сведению, JEP 230: Microbenchmark Suite является проектом OpenJDK для:
Эта функция появилась в Java 12 .
Java Microbenchmark Harness (JMH)
Для более ранних версий Java взгляните на проект Java Microbenchmark Harness (JMH), на котором основан JEP 230.
источник
Действительно хороший код.
http://www.rgagnon.com/javadetails/java-0585.html
источник
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Вы можете использовать Perf4j . Очень крутая утилита. Простое использование
Более подробную информацию можно найти в Руководстве разработчикаИзменить: Проект кажется мертвым
источник
источник
Я в основном делаю вариации этого, но, учитывая, как работает компиляция горячих точек, если вы хотите получить точные результаты, вам нужно выбросить первые несколько измерений и убедиться, что вы используете метод в реальных приложениях (читайте о приложениях).
Если JIT решит скомпилировать его, ваши цифры будут сильно различаться. так что просто знайте
источник
Используя AOP / AspectJ и
@Loggable
аннотации из jcabi-aspect, вы можете сделать это легко и компактно:Каждый вызов этого метода будет отправляться в средство ведения журнала SLF4J с
DEBUG
уровнем ведения журнала. И каждое сообщение журнала будет включать время выполнения.источник
Spring предоставляет служебный класс org.springframework.util.StopWatch в соответствии с JavaDoc:
Применение:
Вывод:
С аспектами:
источник
Я написал метод для печати времени выполнения метода в удобочитаемой форме. Например, чтобы вычислить факториал в 1 миллион, потребуется приблизительно 9 минут. Таким образом, время выполнения печатается как:
Код здесь:
источник
Есть несколько способов сделать это. Я обычно использую что-то вроде этого:
или то же самое с System.nanoTime ();
Для чего-то большего на стороне бенчмаркинга, кажется, есть и такой: http://jetm.void.fm/ Никогда не пробовал.
источник
Вы можете использовать библиотеку метрик, которая предоставляет различные измерительные приборы. Добавить зависимость:
И настроить его для вашей среды.
Методы могут быть аннотированы с помощью @Timed :
или кусок кода, завернутый с таймером :
Агрегированные метрики могут быть экспортированы в консоль, JMX, CSV или другие.
@Timed
пример вывода метрик:источник
Если вы хотите настенные часы
источник
Как сказал «skaffman», используйте AOP ИЛИ вы можете использовать время выполнения байт-кода, точно так же, как инструменты покрытия метода модульного теста используют для прозрачного добавления информации о синхронизации к вызываемым методам.
Вы можете посмотреть на код, используемый инструментами с открытым исходным кодом, такими как Эмма ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Другим инструментом покрытия с открытым исходным кодом является http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Если вам в конечном итоге удастся сделать то, что вы изложили, пожалуйста. поделитесь этим с сообществом здесь с вашей задачей / банками муравья.
источник
источник
Я изменил код из правильного ответа, чтобы получить результат в считанные секунды:
источник
Вы можете использовать класс секундомера из основного проекта Spring:
Код:
Документация для секундомера: простой секундомер, позволяющий рассчитывать время выполнения ряда задач, показывая общее время выполнения и время выполнения для каждой названной задачи. Скрывает использование System.currentTimeMillis (), улучшая читабельность кода приложения и уменьшая вероятность ошибок вычислений. Обратите внимание, что этот объект не предназначен для работы с потоками и не использует синхронизацию. Этот класс обычно используется для проверки производительности во время проверки концепции и при разработке, а не как часть производственных приложений.
источник
Вы можете попробовать этот способ, если просто хотите знать время.
источник
Хорошо, это простой класс, который будет использоваться для простого простого определения времени ваших функций. Ниже приведен пример.
Пример использования:
Пример вывода на консоль:
источник
В Java 8 представлен новый класс с именем
Instant
. Согласно документу:Это можно использовать как:
Это печатает
PT7.001S
.источник