Среднее время выполнения намного ниже, чем 1 время выполнения - PullRequest
0 голосов
/ 17 октября 2018
public class Runtime {
    public static void main(String[] args) {
        int[] n = {1,100,1000,10000};

        for (int i=0; i<4; i++) {
            StringRepeater s = new StringRepeater();

            long start = System.nanoTime();
            s.repeatString("hello", n[i]);
            long stop = System.nanoTime();

            long runtime = stop - start;
            System.out.println("T(" + n[i] + ") = " + runtime/1000000000.0 + " seconds");
        }

        for (int i=0; i<4; i++) {
            long start = 0;
            long stop = 0;
            long runtime100 = 0;

            for (int j=0; j<100; j++) {
                StringRepeater s = new StringRepeater();

                start = System.nanoTime();
                s.repeatString("hello", n[i]);
                stop = System.nanoTime();

                runtime100 = runtime100 + (stop - start);
            }

        System.out.println("T(" + n[i] + ") = " + runtime100/100000000000.0 + " seconds");
        }
    }
}

Итак, у меня есть этот код, который измеряет время выполнения repeatString

public class StringRepeater {
    public String repeatString(String s, int n){
        String result = "";
    for(int i=0; i<n; i++) {
        result = result + s;
    }
    return result;
    }
} 

Верхняя часть с циклом 1 for рассчитывает время выполнения 1 запуска.Нижняя часть с циклом 2 for вычисляет его на основе среднего значения 100. Но по какой-то причине время выполнения второй части в среднем намного быстрее, особенно при более низких n.Для n = 1 это даже в 100 раз быстрее.

T(1) = 2.3405E-5 seconds
T(100) = 1.47748E-4 seconds
T(1000) = 0.00358515 seconds
T(10000) = 0.173254266 seconds
T(1) = 1.9015E-7 seconds
T(100) = 3.035997E-5 seconds
T(1000) = 0.00168481277 seconds
T(10000) = 0.10354477848 seconds

Это примерно типичный возврат.Мой код неверен или что-то еще происходит.TL: DL, почему среднее время выполнения намного ниже, чем 1x?Вы ожидаете, что это будет довольно похоже, верно?

1 Ответ

0 голосов
/ 17 октября 2018

Есть много вещей, которые требуют внимания:

  1. Лучше избегать деления для контроля времени выполнения, потому что у вас может быть проблема точности.Итак, первое предложение: держите время скорости в наносекундах.

  2. Разница в производительности, вероятно, из-за своевременной компиляции: в первый раз, когда компилятор выполняет код, требуется некоторое время длякомпилировать на лету байт-код.Просто чтобы продемонстрировать это, просто попробуйте инвертировать циклы в вашем коде.Я делаю это для вас:

    public class Runtime {
    public static void main(String[] args) {
        int[] n = { 1, 100, 1000, 10000 };
    
        for (int i = 0; i < 4; i++) {
            long start = 0;
            long stop = 0;
            long runtime100 = 0;
    
            for (int j = 0; j < 100; j++) {
                StringRepeater s = new StringRepeater();
    
                start = System.nanoTime();
                s.repeatString("hello", n[i]);
                stop = System.nanoTime();
    
                runtime100 = runtime100 + (stop - start);
            }
    
            System.out.println("T(" + n[i] + ") = " + runtime100 / 100.0 + " seconds");
        }
    
        for (int i = 0; i < 4; i++) {
            StringRepeater s = new StringRepeater();
    
            long start = System.nanoTime();
            s.repeatString("hello", n[i]);
            long stop = System.nanoTime();
    
            long runtime = stop - start;
            //System.out.println("T(" + n[i] + ") = " + runtime / 1000000000.0 + " seconds");
            System.out.println("T(" + n[i] + ") = " + runtime  + " seconds");
        }
    
    
    }
    
    public static class StringRepeater {
        public String repeatString(String s, int n) {
            String result = "";
            for (int i = 0; i < n; i++) {
                result = result + s;
            }
            return result;
        }
    }
    }
    

Когда я запускаю этот код на своей машине, я получаю следующие результаты:

T(1) = 985.31 seconds
T(100) = 109439.19 seconds
T(1000) = 2604811.29 seconds
T(10000) = 1.1787790449E8 seconds
T(1) = 821 seconds
T(100) = 18886 seconds
T(1000) = 1099442 seconds
T(10000) = 121750683 seconds

Теперь вы видите, чтоЦикл 100 теперь медленнее, чем выполнение одного раунда.Это потому, что он выполняется до этого момента.

3 - Если вы наблюдаете вышеуказанный результат, вы, вероятно, заметите, что теперь ситуация просто противоположна исходной ситуации.Зачем?На мой взгляд, это связано с работой сборщика мусора.В большем цикле сбор мусора требует больше работы, просто потому, что есть много временных переменных для мусора.

Надеюсь, это поможет вам.

...