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