Мне интересно, почему требуется намного больше времени для запуска цикла с длинным индексом по сравнению с целым индексом?
Есть идеи?
благодаря
int n = 1000_000_000;
long n2 =n;
long t1 = System.currentTimeMillis();
for( int idx = 0; idx<n;idx++){
}
long t2 = System.currentTimeMillis();
for( long idx = 0; idx<n2;idx++){
}
long t3 = System.currentTimeMillis();
long dt1 = t2-t1;
long dt2 = t3-t2;
System.out.println("with int = took " + dt1 +"ms");
System.out.println("with long = took " + dt2 +"ms");
Возможно, это связано с размером слова, которое использует ваша JVM. Для 32-битного размера слова ints
потребует одно слово, тогда как longs
потребует 2 слова для хранения. Таким образом, в основном чтение long
стоимости в основном составляет 2 чтения, а их запись снова записывается 2 раза.
Другое дело - операция увеличения. Спецификация JVM не имеет набора инструкций для увеличения long
типа. Он имеет iinc
, но не имеет linc
. Таким образом, операция приращения также должна проходить через iinc
(что может снова использовать 2 слова, возможно, это также может привести к 2- iinc
операциям iinc
). В целом, арифметика на long
типе немного сложнее по сравнению с тем, что на int
типа. Но, конечно, не должно быть слишком много проблем. Наверное, это возможные причины небольшого медленного результата.
Оптимизатор Java (Oracle JDK 1.8.0_60) способен преодолевать int-loop, но он не знает, как оптимизировать длинный цикл.
Изменение n
от 1000_000_000 до 2000_000_000 не влияет на время выполнения цикла int, но это приводит к тому, что длинный цикл работает в два раза.