Сколько времени занимает выполнение цикла? - PullRequest
8 голосов
/ 05 июня 2011

Есть ли способ узнать, сколько секунд требуется цикл для выполнения в Java?

Например:

for(int i=0; i < 1000000; i++) {

//Do some difficult task goes in here

}

Это не обязательно должно быть точно на 100%, а просто для того, чтобы понять, сколько времени это займет. Алгоритм внутри является своего рода генератором ключей, который пишет в файл .txt. Я ожидаю, что это займет даже несколько минут, поэтому для моего первого теста я хочу посчитать секунды.

Ответы [ 4 ]

13 голосов
/ 05 июня 2011

Вы должны быть очень осторожны при написании микро-тестов на Java. Например:

  • Если JIT-компилятор может выяснить, что тело цикла не влияет на результаты кода, он может оптимизировать его. Например:

    for (int i = 0; i < 1000000; i++) {
       int j = i + 1;
    }
    

    , вероятно, "очень быстро" бежит.

  • Код выполняется намного быстрее после компиляции JIT.

  • Код может появиться , чтобы работать намного медленнее , пока он JIT-компилируется.

  • Если код распределяет объекты, необходимо учитывать потенциальную изменчивость измеренной производительности из-за работы ГХ, слишком мал начальный или максимальный размер кучи и т. Д.

И, конечно, производительность будет зависеть от вашего оборудования, операционной системы, версии и уровня исправлений вашей JVM, а также от параметров запуска JVM.

10 голосов
/ 05 июня 2011

Здесь вы можете попробовать это:

long startTime = System.currentTimeMillis();
long endTime = 0;

    for(int i=0; i < 1000000; i++) {

    //Something

    }

endTime = System.currentTimeMillis();

long timeneeded =  ((startTime - endTime) /1000);
3 голосов
/ 05 июня 2011

Одним из способов определения времени операции является получение среднего значения с помощью nanoTime (). Возможно, вы захотите настроить количество итераций, и вы получите меньшее отклонение от среднего.nanoTime лучше, чем currentTimeMillis, в том смысле, что он более точный и монотонно растущий (он не вернется назад во время работы приложения)

long start = System.nanoTime();
int runs = 1000*1000;
for(int i=0;i<runs;i++) {
   // do test
}
long time = System.nanoTime() - start;
System.out.printf("The average time taken was %.1f ns%n", (double) time / runs);

Использование printf позволяет форматировать результат.Вы можете разделить на 1000, чтобы получить микросекунды или 1000000 для микросекунд.

2 голосов
/ 05 июня 2011

Это зависит от операции внутри цикла, поэтому вам нужно записать время начала цикла и время окончания цикла, а затем вычислить разницу.Вы получите время, необходимое для завершения цикла.Пример: -

long st = System.currentTimeMillis();

for(int i=0; i < 1000000; i++) {
    // --- loop operation
}

System.out.print("time to execute loop"+
                     ((st - System.currentTimeMillis()) /1000));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...