Я пытаюсь получить время выполнения для алгоритма java-программы. Я просмотрел похожие вопросы и попробовал несколько способов сделать это, но когда я печатаю промежуток времени, я всегда получаю 0.
Instant start = Instant.now(); //Method I want to get the exec time Instant end = Instant.now(); System.out.println(«nTime lapse: «+Duration.between(start, end));
Time lapse: PT0S
Date d = new Date(); long t1, t2; t1 = d.getTime(); //Method I want to get the exec time t2 = d.getTime(); System.out.println(«nTime lapse: «+(t2-t1));
Time lapse: 0
Между тем, получение времени exec в C одного и того же метода дает справедливый результат:
#include clock_t start, end; double time; start = clock(); //Method I want to get the exec time end = clock(); time = (double) (end-start) / CLOCKS_PER_SEC; printf(«nTime lapse: %fn», time);
Time lapse: 0.000004
Почему я не могу сделать это на Java?
РЕДАКТИРОВАТЬ
Я попытался использовать getTimeInMillis(), как было предложено:
Где найти время учить Java?
Calendar cal = Calendar.getInstance(); double start = cal.getTimeInMillis(); //Method I want to get the exec time double end = cal.getTimeInMillis(); System.out.println(«nTime lapse: «+(end — start));
Time lapse: 0.0
3 ответа
1 Решение Ayo K [2018-01-18 13:34:00]
Чтобы это сработало, вам нужно получить время в миллисекундах, а затем получить разницу.
Для этого вы можете использовать System.currentTimeMillis() . Затем получите разницу в конце.
ПРИМЕР
long start = System.currentTimeMillis(); System.out.println(«start: «+start); long stop = System.currentTimeMillis(); System.out.println(«stop: «+stop); ///convert to seconds System.out.println((stop-start)/1000f);
0.057
EDIT Если код работает менее чем за миллион секунд, вы можете использовать Nano seconds, используя System.nanoTime() . Для целей моделирования вы можете вызвать Thread.sleep(n) чтобы создать задержку, где n — это то, как долго вы собираетесь задерживать миллисекунды.
Пример с Instant :
Instant s = Instant.now(); for (int i = 0; i < 100000; i++) < System.out.println(i); >Instant s1 = Instant.now(); System.out.println(s1.getNano() — s.getNano()); System.out.println(Duration.between(s, s1));
347000000 PT0.347S
Date d = new Date(); for (int i = 0; i < 100000; i++) < System.out.println(i); >Date d1 = new Date(); System.out.println(d1.getTime() — d.getTime());
теперь вам нужно только рассчитать тип, который вы хотите (секунды, миллисекунды или что-то еще). Документы расскажут вам, что вы получаете от методов, если имена не понятны
0 ItamarG3 [2018-01-18 13:39:00]
В примере с использованием Date вам необходимо воссоздать объект Date (конструктор установил время для текущего времени):
int t1 = (new Date()).getTime(); //method you want to check int t2 = (new Date()).getTime();
Или просто используйте System.getCurrentTimeMillis() один раз раньше, затем один раз после
Как узнать время выполнения программы? #python #программирование
Источник: qarchive.ru
Как мне рассчитать время выполнения метода в Java?
Как я могу получить время выполнения метода? Существует ли служебный класс Timer для таких вещей, как определение времени, сколько времени занимает задача и т. Д.?
Большинство запросов в Google возвращают результаты для таймеров, которые планируют потоки и задачи, а это не то, что мне нужно.
user13140 07 окт ’08 в 20:10 2008-10-07 20:10
2008-10-07 20:10
42 ответа
Всегда есть старомодный способ:
long startTime = System.nanoTime(); methodToTime(); long endTime = System.nanoTime(); long duration = (endTime — startTime); //divide by 1000000 to get milliseconds.
user18093 07 окт ’08 в 20:16 2008-10-07 20:16
2008-10-07 20:16
Я иду с простым ответом. Работает для меня.
long startTime = System.currentTimeMillis(); doReallyLongThing(); long endTime = System.currentTimeMillis(); System.out.println(«That took » + (endTime — startTime) + » milliseconds»);
Это работает довольно хорошо. Разрешение очевидно только с точностью до миллисекунды, вы можете сделать лучше с System.nanoTime(). Есть некоторые ограничения для обоих (срезы расписания операционной системы и т. Д.), Но это работает довольно хорошо.
В среднем за пару пробежек (чем больше, тем лучше), и вы получите достойную идею.
user18189 07 окт ’08 в 20:14 2008-10-07 20:14
2008-10-07 20:14
Давайте, ребята! Никто не упомянул способ Гуавы сделать это (что, возможно, потрясающе):
import com.google.common.base.Stopwatch; Stopwatch timer = Stopwatch.createStarted(); //method invocation LOG.info(«Method took: » + timer.stop());
Приятно то, что Stopwatch.toString() делает хорошую работу по выбору единиц времени для измерения. Т.е. если значение маленькое, оно выдаст 38 нс, если длинное, то покажет 5 м 3 с
Stopwatch timer = Stopwatch.createUnstarted(); for (. ) < timer.start(); methodToTrackTimeFor(); timer.stop(); methodNotToTrackTimeFor(); >LOG.info(«Method took: » + timer);
Примечание: Google Guava требует Java 1.6+
user857165 13 мар ’13 в 20:11 2013-03-13 20:11
2013-03-13 20:11
Используя Instant и Duration из нового API Java 8,
Instant start = Instant.now(); Thread.sleep(5000); Instant end = Instant.now(); System.out.println(Duration.between(start, end));
PT5S
user1149423 02 фев ’15 в 09:19 2015-02-02 09:19
2015-02-02 09:19
Собрались все возможные пути вместе в одном месте.
Date startDate = Calendar.getInstance().getTime(); long d_StartTime = new Date().getTime(); Thread.sleep(1000 * 4); Date endDate = Calendar.getInstance().getTime(); long d_endTime = new Date().getTime(); System.out.format(«StartDate : %s, EndDate : %s n», startDate, endDate); System.out.format(«Milli = %s, ( D_Start : %s, D_End : %s ) n», (d_endTime — d_StartTime),d_StartTime, d_endTime);
Система. currentTimeMillis ()
long startTime = System.currentTimeMillis(); Thread.sleep(1000 * 4); long endTime = System.currentTimeMillis(); long duration = (endTime — startTime); System.out.format(«Milli = %s, ( S_Start : %s, S_End : %s ) n», duration, startTime, endTime ); System.out.println(«Human-Readable format : «+millisToShortDHMS( duration ) );
Удобочитаемый формат
public static String millisToShortDHMS(long duration) < String res = «»; // java.util.concurrent.TimeUnit; long days = TimeUnit.MILLISECONDS.toDays(duration); long hours = TimeUnit.MILLISECONDS.toHours(duration) — TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration)); long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) — TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration)); long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) — TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)); long millis = TimeUnit.MILLISECONDS.toMillis(duration) — TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) res = String.format(«%02d:%02d:%02d.%04d», hours, minutes, seconds, millis); else res = String.format(«%dd %02d:%02d:%02d.%04d», days, hours, minutes, seconds, millis); return res; >
Guava: Google Stopwatch JAR «Цель секундомера — измерить прошедшее время в наносекундах.
com.google.common.base.Stopwatch g_SW = Stopwatch.createUnstarted(); g_SW.start(); Thread.sleep(1000 * 4); g_SW.stop(); System.out.println(«Google StopWatch : «+g_SW);
Apache Commons Lang JAR » StopWatch предоставляет удобный API для таймингов.
org.apache.commons.lang3.time.StopWatch sw = new StopWatch(); sw.start(); Thread.sleep(1000 * 4); sw.stop(); System.out.println(«Apache StopWatch : «+ millisToShortDHMS(sw.getTime()) );
ДЖОДА- ВРЕМЯ
public static void jodaTime() throws InterruptedException, ParseException < java.text.SimpleDateFormat ms_SDF = new SimpleDateFormat(«yyyy/MM/dd HH:mm:ss.SSS»); String start = ms_SDF.format( new Date() ); // java.util.Date Thread.sleep(10000); String end = ms_SDF.format( new Date() ); System.out.println(«Start:»+start+»t Stop:»+end); Date date_1 = ms_SDF.parse(start); Date date_2 = ms_SDF.parse(end); Interval interval = new org.joda.time.Interval( date_1.getTime(), date_2.getTime() ); Period period = interval.toPeriod(); //org.joda.time.Period System.out.format(«%dY/%dM/%dD, %02d:%02d:%02d.%04d n», period.getYears(), period.getMonths(), period.getDays(), period.getHours(), period.getMinutes(), period.getSeconds(), period.getMillis()); >
Java date time API из Java 8 «Объект Duration представляет период времени между двумя объектами Instant.
Instant start = java.time.Instant.now(); Thread.sleep(1000); Instant end = java.time.Instant.now(); Duration between = java.time.Duration.between(start, end); System.out.println( between ); // PT1.001S System.out.format(«%dD, %02d:%02d:%02d.%04d n», between.toDays(), between.toHours(), between.toMinutes(), between.getSeconds(), between.toMillis()); // 0D, 00:00:01.1001
Spring Framework предоставляет служебный класс StopWatch для измерения прошедшего времени в Java.
StopWatch sw = new org.springframework.util.StopWatch(); sw.start(«Method-1»); // Start a named task Thread.sleep(500); sw.stop(); sw.start(«Method-2»); Thread.sleep(300); sw.stop(); sw.start(«Method-3»); Thread.sleep(200); sw.stop(); System.out.println(«Total time in milliseconds for all tasks :n»+sw.getTotalTimeMillis()); System.out.println(«Table describing all tasks performed :n»+sw.prettyPrint()); System.out.format(«Time taken by the last task : [%s]:[%d]», sw.getLastTaskName(),sw.getLastTaskTimeMillis()); System.out.println(«n Array of the data for tasks performed « Task Name: Time Taken»); TaskInfo[] listofTasks = sw.getTaskInfo(); for (TaskInfo task : listofTasks)
Total time in milliseconds for all tasks : 999 Table describing all tasks performed : StopWatch »: running time (millis) = 999 —————————————— ms % Task name —————————————— 00500 050% Method-1 00299 030% Method-2 00200 020% Method-3 Time taken by the last task : [Method-3]:[200] Array of the data for tasks performed « Task Name: Time Taken [Method-1]:[500] [Method-2]:[299] [Method-3]:[200]
Источник: stackru.com
Как найти время выполнения программы java
Как подсчитать время выполнения программы без учета загрузки JVM?
И как подсчитать время выполнения отдельного метода?
Re: Подсчет времени выполнения программы
От: | Cider |
Дата: | 01.07.03 13:48 |
Оценка: |
Здравствуйте, Ogre, Вы писали:
O>Как подсчитать время выполнения программы без учета загрузки JVM?
O>И как подсчитать время выполнения отдельного метода?
1. Можно замерять время до и после каждой конкретной операции:
long before = System.currentTimeMillis(); . long after = System.currentTimeMillis(); long diff = after — before;
2. А можно использовать какой-нибудь профайлер.
Re: Подсчет времени выполнения программы
От: | ukman | http://math.welobox.com |
Дата: | 02.07.03 07:56 | |
Оценка: |
Здравствуйте, Ogre, Вы писали:
O>Как подсчитать время выполнения программы без учета загрузки JVM?
O>И как подсчитать время выполнения отдельного метода?
Лучше всего использовать профайлер. Можно, например, воспользоваться тем, что входит в состав JDK- javap, А можно взять Numega-вский профайлер. Он очень приятную статистику выдает. Не советую использовать замеры времени руками- очень быстрые методы не измеришь, будет лимо 0 мс, либо 10.
Источник: www.rsdn.org