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

Как выполнить скорость выполнения Java-программы

Как вы оцениваете время выполнения Java-программы? Я не уверен, какой класс я должен использовать, чтобы сделать это.

Я вроде ищу что-то вроде:

// Some timer starts here
for (int i = 0; i < length; i++) {
  // Do something
}
// End timer here

System.out.println("Total execution time: " + totalExecutionTime);
4b9b3361

Ответ 1

final long startTime = System.currentTimeMillis();
for (int i = 0; i < length; i++) {
  // Do something
}
final long endTime = System.currentTimeMillis();

System.out.println("Total execution time: " + (endTime - startTime));

Ответ 2

Имейте в System#nanoTime() что есть некоторые проблемы, когда System#nanoTime() не может надежно использоваться на многоядерном процессоре для записи истекшего времени... каждое ядро поддерживает свой собственный TSC (счетчик меток времени): этот счетчик используется для получения нано время (на самом деле это количество тактов с момента загрузки процессора).

Следовательно, если ОС не выполняет некоторую деформацию времени TSC для синхронизации ядер, то, если поток будет запланирован на одном ядре при начальном считывании времени, а затем переключен на другое ядро, относительное время может время от времени казаться скачкообразным и вперед.

Я наблюдал это некоторое время назад на AMD/Solaris, где прошедшие времена между двумя временными точками иногда возвращались либо как отрицательные значения, либо как неожиданно большие положительные числа. Был патч ядра Solaris и настройка BIOS, необходимая для принудительного включения AMD PowerNow! выкл, который, казалось, решил это.

Кроме того, существует (AFAIK) еще не исправленная ошибка при использовании java System#nanoTime() в среде VirtualBox; вызывая у нас всевозможные странные проблемы с многопоточностью, так как большая часть пакета java.util.concurrency зависит от времени nano.

Смотрите также:

Является ли System.nanoTime() полностью бесполезным? http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html

Ответ 3

Вы можете использовать System#nanoTime(). Получите его до и после исполнения и просто выполните математику. Он предпочитал выше System#currentTimeMillis(), потому что он имеет лучшую точность. В зависимости от используемого оборудования и используемой платформы в противном случае вы можете получить неправильный промежуток времени. Здесь, с Core2Duo в Windows, от 0 до 15 мс, ничто не может быть рассчитано.

Более продвинутым инструментом является profiler.

Ответ 4

Вы получаете текущее системное время в миллисекундах:

final long startTime = System.currentTimeMillis();

Затем вы делаете то, что собираетесь делать:

for (int i = 0; i < length; i++) {
  // Do something
}

Затем вы увидите, сколько времени прошло:

final long elapsedTimeMillis = System.currentTimeMillis() - startTime;

Ответ 5

Для простых вещей System.currentTimeMillis() может работать.

На самом деле так распространено, что моя IDE настроена так, что после ввода "t0" она генерирует мне следующую строку:

final long t0 = System.currentTimeMillis()

Но для более сложных вещей вы, вероятно, захотите использовать статистические измерения времени, например здесь (прокрутите вниз немного и посмотрите на измеренные измерения времени, включая стандартные отклонения и т.д.):

http://perf4j.codehaus.org/devguide.html

Ответ 6

Использование AOP/AspectJ и @Loggable аннотация из jcabi-аспекты вы можете сделать это легко и компактно:

@Loggable(Loggable.DEBUG)
public String getSomeResult() {
  // return some value
}

Каждый вызов этого метода будет отправлен в службу регистрации SLF4J с уровнем журналирования DEBUG. И каждое сообщение журнала будет включать время выполнения.

Ответ 7

используйте long startTime=System.currentTimeMillis() для времени начала, в верхней части цикла

положите long endTime= System.currentTimeMillis(); за пределы цикла. Вы должны будете вычесть значения для получения времени выполнения в миллисекундах.

Если вы хотите время в наносекундах, проверьте System.nanoTime()

Ответ 8

Вот несколько способов найти время выполнения в Java:

1) System.nanoTime()

long startTime = System.nanoTime();
.....your code....
long endTime   = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println("Execution time in nanoseconds  : " + totalTime);
System.out.println("Execution time in milliseconds : " + totalTime / 1000000);

2) System.currentTimeMillis()

long startTime = System.currentTimeMillis();
.....your code....
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds  : " + totalTime);

3) Instant.now()

long startTime = Instant.now().toEpochMilli();
.....your code....
long endTime = Instant.now().toEpochMilli();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds: " + totalTime);

или же

Instant start = Instant.now();
.....your code....
Instant end = Instant.now();
Duration interval = Duration.between(start, end);
System.out.println("Execution time in seconds: " +interval.getSeconds());

4) Date.getTime()

long startTime = new Date().getTime();
.....your code....
long endTime = new Date().getTime();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds: " + totalTime);

Ответ 9

Я создал функцию более высокого порядка, которая принимает код, который вы хотите измерить в/как лямбду:

class Utils {

    public static <T> T timeIt(String msg, Supplier<T> s) {
        long startTime = System.nanoTime();
        T t = s.get();
        long endTime = System.nanoTime();
        System.out.println(msg + ": " + (endTime - startTime) + " ns");
        return t;
    }

    public static void timeIt(String msg, Runnable r) {
       timeIt(msg, () -> {r.run(); return null; });
    }
}

Назовите это так:

Utils.timeIt("code 0", () ->
        System.out.println("Hallo")
);

// in case you need the result of the lambda
int i = Utils.timeIt("code 1", () ->
        5 * 5
);

Выход:

код 0: 180528 нс
код 1:12003 нс

Отдельное спасибо Энди Тернеру, который помог мне сократить избыточность.Смотрите здесь.

Ответ 11

public class someClass
{
   public static void main(String[] args) // your app start point
   {
       long start = java.util.Calendar.getInstance().getTimeInMillis();

       ... your stuff ...

       long end = java.util.Calendar.getInstance().getTimeInMillis();
       System.out.println("it took this long to complete this stuff: " + (end - start) + "ms");
   }
}

Ответ 12

Вы также можете попробовать Perf4J. Его аккуратный способ делать то, что вы ищете, и помогает в агрегированных статистиках производительности, таких как среднее, минимальное, максимальное, стандартное отклонение и транзакции в секунду в течение заданного промежутка времени. Выдержка из http://perf4j.codehaus.org/devguide.html:

StopWatch stopWatch = new LoggingStopWatch();

try {
    // the code block being timed - this is just a dummy example
    long sleepTime = (long)(Math.random() * 1000L);
    Thread.sleep(sleepTime);
    if (sleepTime > 500L) {
        throw new Exception("Throwing exception");
    }

    stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms");
} catch (Exception e) {
    stopWatch.stop("codeBlock2.failure", "Exception was: " + e);
}

Вывод:

INFO: start[1230493236109] time[447] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493236719] time[567] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493237286] time[986] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493238273] time[194] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238467] time[463] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238930] time[310] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239241] time[610] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493239852] time[84] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239937] time[30] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239968] time[852] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]

Ответ 13

Использование System.currentTimeMillis() - правильный способ сделать это. Но, если вы используете командную строку, и хотите быстро и быстро вывести всю программу, подумайте:

time java App

который позволяет вам не изменять код и время вашего приложения.