Время работы функции (короткая продолжительность) - PullRequest
0 голосов
/ 14 ноября 2018

Я относительно новичок в программировании на 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 , но у каждого из них есть свои проблемы ..., к которым я могу обратиться, если вам нужно.

В любом случае, заранее благодарю за помощь и опыт!

...