как узнать время работы программы java
Как замерить время выполнения
Зачастую требуется узнать, сколько времени выполняется тот или иной код. Иногда требуется замерить время выполнения метода или какой-то задачи. В данной статье мы расскажем вам принципы замера времени в Java и покажем лучшие практики для конкретных задач.
Замер времени с помощью currentTimeMills()
Это довольно простой способ измерить время. Метод System.currentTimeMillis() вернёт вам текущее время в миллисекундах. Его потребуется вызвать до выполнения нужной задачи и после, а затем вычислить разницу. В итоге мы узнаем время выполнения в миллисекундах:
При работе с данным методом следует учитывать его специфику: System.currentTimeMillis() показывает текущее время, основываясь на системных часах и может выдавать некорректный результат.
Замер времени с помощью nanoTime()
Ещё один метод для получения текущего времени это System.nanoTime(). Как следует из названия, этот метод возвращает время с точностью до нансекунд. Также работа этого метода не зависит от системных часов.
Он используется аналогично:
Для получения значения в миллисекундах результат можно разделить на 1000:
Важно: Хотя метод nanoTime() может возвращать время в наносекундах, он не гарантирует, что значения между его вызовами будут обновляться с точностью до наносекунд.
Но всё же это более приемлемый вариант, чем System.currentTimeMillis().
Замер времени с помощью Instant и Duration
В Java 8 добавили новый java.time API. В частности, ля измерения времени подойдут два новых класса – Instant и Duration. Оба эти класса иммутабельны.
Instant обозначает момент времени с начала эпохи Unix (1970-01-01T00:00:00Z). Для создания момента мы используем метод Instant.now(). После того, как мы создали два момент, вычислим разницу в миллисекундах:
Рекомендуется использовать именно этот подход в Java 8 и выше.
Замер времени выполнения с помощью StopWatch
StopWatch – это класс из библиотеки Apache Commons Lang. Он работает как секундомер. Для его использования сначала требуется подключить библиотеку к проекту:
Теперь создадим экземпляр StopWatch. Затем начнём отсчёт с помощью метода start() и окончим отсчёт с помощью метода stop():
StopWatch удобно использовать тогда, когда в проекте уже подключена данная библиотека.
Исходный код
Заключение
В данной статье мы разобрали простые методы замера времени выполнения в Java. Для простых замеров можно использовать все вышеперечисленные методы, кроме currentTimeMillis (из-за того, что он зависит от системных часов).
Как засечь время выполнения цикла или программы или какого-то оператора?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Засечь время выполнения (в ms) определённого кода или части кода
Доброго времени суток всем. Хотелось бы поинтересоваться у знающих людей. Как можно засеч время.
Какой функцией можно засечь время выполнения программы
Здравствуйте. подскажите какой функцией можно засечь время выполнения программы и вывести его в.
Как запретить удаление Папки или Файла на время выполнения программы
Собственно сабж. Нужно запретить удаление папки, причем совершенно левой, как это сделать кто.
Как засечь время выполнения функции?
Упражнение 3.1 K&R как новичку без серьезных описаний и дополнений кода засечь время выполнения.
К сожалению, считать время выполнения таких вещей очень и очень сложно. И, разумеется, одним currentTimeMillis() или nanoTime() здесь не отделаться.
Во-первых, вы знаете в каком режиме у вас будет работать метод в момент подсчета? Если в интерпретируемом режиме (выполнение байт-кода), то у вас будут одни цифры. Если в скомпилированном варианте (нативный код), то совсем другие. Если начнут компилироваться какие-то зависимые методы, то третьи. И т.д..
Во-вторых, а вы уверены, что ваш цикл реально будет выполнятся? Может быть в боевом окружении он работает, а в тестовом компилятор, проведя escape-analysis, его тупо игнорирует?
В-третьих, у самих методов получения времени есть свои погрешности. Например, на линуксах они порядка 30-50 наносекунд. На Виндах могут доходить до тысяч наносекунд. Это озаначает, что невозможо более-менее точно замерить что-то, что длиться меньше указанного времени (по аналогии с длиной волны света и разрешающей способности светового микроскопа).
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Засечь время выполнения поиска
Создается массив случайных чисел, сортируется, и затем проводится поиск по этому массиву. Для.
Нужно засечь время выполнения процедуры
писал вот код form1.timer.enabled:=true; search; form1.timer.enabled:=false;Код таймера.
Окно программы во время выполнения цикла
Пока выполняется цикл в программе окно становится не доступным. Ни свернуть не переместить и тд.
Подсчёт времени выполнения метода через аннотацию
Во многих проектах требуется посчитать время, которое затратил тот или иной метод. Для этого можно вручную сохранять значение System.currentTimeMillis() и после метода вычислять затраченное время. Когда методов много это становится не очень удобным.
Поэтому я решил написать простенькую аннотацию, которая бы считала время выполнения метода. Попытавшись найти информацию в интернете, понял, что её по данной теме очень мало. Придётся как-то выкручиваться, собирая информацию по крупицам.
Наша аннотация будет помечать методы, для которых мы хотим посчитать время выполнения в миллисекундах или наносекундах и выводить результат через System.out.println.
Для начала создадим саму аннотацию:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
Поле interval служит для указания интервала времени (миллисекунды или наносекунды), поле format задаёт формат вывода результата.
Теперь, чтобы данная аннотация сработала как надо, нужно создать класс-обработчик расширяющий AbstractProcessor. В данном классе добавляется сохранение времени перед кодом метода, сам код метода копируется в блок try-finally, а блоке finally вычисляется затраченное методом время и выводится в консоль:
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.TypeTags;
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCBlock;
import com.sun.tools.javac.tree.JCTree.JCCatch;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCStatement;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util. List ;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
@SupportedAnnotationTypes( value =
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class TimeAnnotationProcessor extends AbstractProcessor <
public static final String ANNOTATION_TYPE = «annotations.time.Time» ;
private JavacProcessingEnvironment javacProcessingEnv;
private TreeMaker maker;
@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) <
if (annotations == null || annotations.isEmpty()) <
return false ;
>
final Elements elements = javacProcessingEnv.getElementUtils();
final TypeElement annotation = elements.getTypeElement(ANNOTATION_TYPE);
// Заменяем старый код метода на новый
((JCMethodDecl) blockNode).body.stats = newStatements;
>
>
>
protected JCBlock makePrintBlock(TreeMaker maker, JavacElements utils, Time time, JCVariableDecl var ) <
// Создаём вызов System.out.println
JCExpression printlnExpression = maker.Ident(utils.getName( «System» ));
printlnExpression = maker.Select(printlnExpression, utils.getName( «out» ));
printlnExpression = maker.Select(printlnExpression, utils.getName( «println» ));
// Форматируем результат
JCExpression formatExpression = maker.Ident(utils.getName( «String» ));
formatExpression = maker.Select(formatExpression, utils.getName( «format» ));
Для того чтобы компилятор java использовал наш управляющий класс, нужно создать файл META-INF/javax.annotation.processing.Processor, в котором должна быть прописана следующая строка:
annotations.time.TimeAnnotationProcessor
После этого собираем все наши файлы в annotations.jar и добавляем его в classpath к любому проекту.
Теперь, чтобы посчитать время выполнения метода, достаточно добавить к этому методу аннотацию Time и после его выполнения в консоль будет выведено затраченное методом время:
В результате в консоли увидим:
method time: 1000 ms
Как время выполнения метода в Java?
Как получить время выполнения метода? Есть ли класс утилиты таймера для таких вещей, как время, сколько времени занимает задача и т. д.?
большинство поисков в Google возвращают результаты для таймеров, которые планируют потоки и задачи, что не то, что я хочу.
30 ответов
Я иду с простым ответом. Работать на меня.
он работает довольно хорошо. Разрешение, очевидно, только до миллисекунды, вы можете сделать лучше с системой.nanoTime(). Существуют некоторые ограничения для обоих (срезы расписания операционной системы и т. д.) но это работает довольно хорошо.
среднее значение через пару прогонов (чем больше, тем лучше), и вы получите достойную идею.
ребята! Никто не упоминал гуавы способ сделать это (что, бесспорно, офигенно):
хорошая вещь, что секундомер.toString () выполняет хорошую работу по выбору единиц времени для измерения. Т. е. если значение мало, оно выведет 38 НС, если оно длинное, то оно покажет 5м 3С
Примечание: Google Guava требует Java 1.6+
используя МиГ и продолжительность из нового API Java 8,
используйте профилировщик (Jprofiler, Netbeans Profiler, Visual VM, Eclipse Profiler и т. д.). Вы получите наиболее точные результаты и наименее навязчивы. Они используют встроенный механизм JVM для профилирования, который также может дать вам дополнительную информацию, такую как трассировки стека, пути выполнения и более полные результаты, если это необходимо.
собрали все возможные варианты в одном месте.
Удобочитаемом
Гуава: Google секундомер JAR » объектом секундомера является измеряет прошедшее время в наносекундах.
Apache Commons Lang JAR «секундомер предоставляет удобный API для таймингов.
Джодавремени
JAVA дата время API от Java 8 » A продолжительность
Это, вероятно, не то, что вы хотели, чтобы я сказал, но это хорошее использование AOP. Взбейте прокси-перехватчик вокруг вашего метода и сделайте время там.
что, почему и как AOP довольно выходит за рамки этого ответа, к сожалению, но это то, как я, вероятно, это сделаю.
Edit:вот ссылка Весна AOP, чтобы вы начали, если вы заинтересованы. Это самая доступная реализация AOP, с которой сталкивается Iive Ява.
кроме того, учитывая очень простые предложения всех остальных, я должен добавить, что AOP-это когда вы не хотите, чтобы такие вещи, как время, вторглись в ваш код. Но во многих случаях, такой простой и легкий подход-это нормально.
System.currentTimeMillis(); не является хорошим подходом для измерения производительности ваших алгоритмов. Он измеряет общее время, которое вы испытываете в качестве пользователя, наблюдающего за экраном компьютера. Он также включает в себя время, затрачиваемое на все остальное работает на вашем компьютере в фоновом режиме. Это может иметь огромное значение, если на вашей рабочей станции работает много программ.
правильный подход использует java.lang.management пакета.
getCpuTime() метод дает вам сумму тех:
С Java 8 вы также можете сделать что-то подобное с каждым нормальным методы:
С помощью этого methode вы можете легко измерять время в любом месте вашего кода, не нарушая его. В этом простом примере я просто печатаю время. Можете ли вы добавить переключатель для TimeIt, например, только для печати времени в DebugMode или что-то еще.
Если вы работаете с функции вы можете сделать что-то вроде это:
также мы можем использовать класс секундомера Apache commons Для измерения времени.
просто небольшой поворот, если вы не используете инструменты и хотите использовать методы с низким временем выполнения: выполняйте его много раз, каждый раз удваивая количество раз, пока не достигнете секунды или около того. Таким образом, время вызова системы.nanoTime и так далее, ни точность системы.nanoTime сильно влияет на результат.
конечно, предостережения об использовании настенных часов применяются: влияния JIT-компиляции, нескольких потоков / процессов и т. д. Таким образом, вы необходимо сначала выполнить метод большое раз сначала, так что компилятор JIT выполняет свою работу, а затем повторите этот тест несколько раз и возьмите наименьшее время выполнения.
для этой цели мы используем аннотации AspectJ и Java. Если нам нужно знать время выполнения метода, мы просто аннотируем его. Более продвинутая версия может использовать собственный уровень журнала, который может быть включен и отключен во время выполнения.
JEP 230: Microbenchmark Suite
можно использовать Perf4j. Очень классная утилита. Использование просто
более подробную информацию можно найти в Руководство Разработчика
изменить: кажется, умер
использование AOP / AspectJ и @Loggable аннотации jcabi-аспекты вы можете сделать это легкий и компактный:
каждый вызов этого метода будет отправлен на объект регистрации SLF4J с DEBUG уровень ведения журнала. И каждое сообщение журнала будет включать время выполнения.
Я в основном делаю вариации этого, но, учитывая, как работает компиляция hotspot, если вы хотите получить точные результаты, вам нужно выбросить первые несколько измерений и убедиться, что вы используете метод в реальном мире (прочитайте конкретное приложение).
Если JIT решит скомпилировать его, ваши номера будут сильно отличаться. так что просто будьте в курсе
есть несколько способов сделать это. Обычно я возвращаюсь к использованию чего-то подобного:
или то же самое с системой.nanoTime();
для чего-то большего на стороне бенчмаркинга вещей, кажется, также есть этот:http://jetm.void.fm/ Никогда не пробовал.
Если вы хотите настенные часы время
Как сказал «skaffman», используйте AOP или вы можете использовать байт-код времени выполнения, так же, как инструменты покрытия метода модульного теста используют для прозрачного добавления информации о времени к вызываемым методам.
Если вам в конечном итоге удастся сделать то, что вы наметили, pls. поделитесь им с сообществом здесь с вашей задачей ant / jars.
Spring предоставляет служебный класс org.springframework.утиль.Секундомер, согласно JavaDoc:
простой секундомер, позволяющ для времени нескольких задач, подвергая действию общее время выполнения и время выполнения для каждой именованной задачи.
С Аспектами:
Я изменил код с правильного ответа, чтобы получить результат в секундах:
вы можете попробовать этот способ, если просто хотите знать время.
Ok, это простой класс, который будет использоваться для простого простого синхронизации ваших функций. Ниже приведен пример.
пример вывода на консоль:
в Java 8 новый класс с именем это. Согласно doc:
Instant представляет собой начало наносекунды на временной линии. Этот класс полезен для создания метки времени для представления машинного времени. Диапазон мгновения требует хранения числа больше, чем a длинный. Для этого класс хранит длинное представление epoch-секунды и int, представляющий наносекунду секунды, которая будет всегда будет между 0 и 999 999 999. Этот epoch-измеряются секунды от стандартной эпохи Java 1970-01-01T00:00:00Z где мгновения после эпохи имеют положительные значения, а более ранние мгновения имеют отрицательное значение. Для эпох-второй и наносекундной частей a большее значение всегда является более поздним по времени, чем меньшее значение.
Это можно использовать как:
можно использовать показатели библиотека, которая предоставляет различные измерительные приборы. Добавить зависимость:
и настройте его для своей среды.
методы могут быть аннотированы с @Timed:
или кусок кода, обернутый таймер:
агрегированные метрики могут экспортироваться в консоль, JMX, CSV или другие.
@Timed пример вывода метрик:
измерения производительности на моей машине
Как уже упоминалось, система.считается, что nanoTime() измеряет прошедшее время. Просто имейте в виду стоимость, если используется insied цикл или тому подобное.
Как посчитать время затраченное на выполнение программы?
задание:Тема: Циклы
Задания для самостоятельной работы:
Задание №1. Написать игру «Угадай число». Программа загадывает число в диапазоне от 1 до 500. Пользователь пытается его угадать. После каждой попытки программа выдает подсказки, больше или меньше его число загаданного. В конце программа выдает статистику: за сколько попыток угадано число, сколько времени это заняло. Предусмотреть выход по 0, в случае, если пользователю надоело угадывать число.
Как посчитать время затраченное на выполнение программы?
Сделал все. кроме подсчета времени, ниже код того, что написал
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Определить время, затраченное на запрос
Есть некая таблица с данными о работниках. SLQ запрос выводит данные об определенных работниках.
Выполнение программы за заданое время
Добрый день. Такая задача. Вводим с клавиатуры число, допустим 100, создается массив из 100 ячеек.
Как посчитать время, затраченное на выполнение
Всем привет. Есть внешняя библиотека к которой обращаемся. Результат выводим в консоль. Как.
Как оценить время затраченное на выполнение длительных операций
Всем здравствуйте. Как точно (миллисекунды) и грамотно оценить интервал времени, затраченный на.