Почему вызов одного и того же метода будет по-разному влиять на время работы в разных методах? - PullRequest
0 голосов
/ 08 мая 2020

Чтобы проверить влияние локальности на время работы программы, я написал программу, как показано ниже.

public class Locality {

    private char[] value = new char[LOOP_COUNT * 4];
    int count = 0;
    private static final int LOOP_COUNT = 100000000;

    public void appendNull() {
        int c = count;
        foo();
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
    }

    public void appendNullNonLocality() {
        int c = count;
        foo();
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
    }

    private void foo() {
        int i = 0;
        i++;
    }

    public static void main(String[] args) {
        Locality
                locality = new Locality(),
                locality1 = new Locality();
        long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < LOOP_COUNT; i++) {
            locality.appendNullNonLocality();
        }
        end = System.currentTimeMillis();
        System.out.println("without locality, the run time is : " + (end - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < LOOP_COUNT; i++) {
            locality1.appendNull();
        }
        end = System.currentTimeMillis();
        System.out.println("with locality, the run time is : " + (end - start));

    }
}

Без вызова foo в appendNull и appendNullNonLocality, appendNull быстрее, чем appendNullNonLocality, как я и догадался. Но когда я вызываю foo в appendNull и appendNullNonLocality, appendNull работает медленнее, чем appendNullNonLocality. Так что меня это смущает. Может ли кто-нибудь объяснить мне причину?.

примечание: я запускаю программу с параметром JVM -Djava.compiler=NONE, чтобы избежать оптимизации JIT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...