Я относительно новичок в программировании на Java, и у меня возникла проблема с подсчетом времени, которое требуется для запуска функции.
Сначала немного предыстории - у меня большой опыт работы с Python, и я пытаюсь воссоздать функциональность функции Jupyter Notebook / Lab %%timeit
, если вы знакомы с этим. Вот фотография этого в действии (извините, пока не хватает кармы):
Отрывок Юпитера %% timeit
То, что он делает, это запускает содержимое ячейки (в данном случае рекурсивную функцию) 1к, 10к или 100к раз, и дает вам среднее время выполнения функции и стандартное отклонение.
Моя первая реализация (использующая ту же рекурсивную функцию) использовала System.nanoTime()
:
public static void main(String[] args) {
long t1, t2, diff;
long[] times = new long[1000];
int t;
for (int i=0; i< 1000; i++) {
t1 = System.nanoTime();
t = triangle(20);
t2 = System.nanoTime();
diff = t2-t1;
System.out.println(diff);
times[i] = diff;
}
long total = 0;
for (int j=0; j<times.length; j++) {
total += times[j];
}
System.out.println("Mean = " + total/1000.0);
}
Но среднее значение дико сбрасывается - по какой-то причине первая итерация функции (во многих случаях) занимает более миллиона наносекунд:
Рис начального вывода терминала
Каждая итерация после первой дюжины или около того занимает либо 395 нано, либо 0 - так что там тоже может быть проблема ... не знаю, что происходит!
Также - код рекурсивной функции, которую я синхронизирую:
static int triangle(int n) {
if (n == 1) {
return n;
} else {
return n + triangle(n -1);
}
}
Первоначально у меня была строка n = Math.abs(n)
в первой строке функции, но затем я удалил ее, потому что ... ме. Я единственный, кто использует это.
Я попробовал несколько различных предложений, выдвинутых в этом посте SO , но у каждого из них есть свои проблемы ..., к которым я могу обратиться, если вам нужно.
В любом случае, заранее благодарю за помощь и опыт!