Цикл производительности с целым и длинным индексом

1

Мне интересно, почему требуется намного больше времени для запуска цикла с длинным индексом по сравнению с целым индексом?

Есть идеи?

благодаря

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");
  • 0
    Я забыл вывод: с int = взял 3 мс с long = взял 337 мс
Показать ещё 4 комментария
Теги:
for-loop
integer
long-integer

2 ответа

2

Возможно, это связано с размером слова, которое использует ваша JVM. Для 32-битного размера слова ints потребует одно слово, тогда как longs потребует 2 слова для хранения. Таким образом, в основном чтение long стоимости в основном составляет 2 чтения, а их запись снова записывается 2 раза.

Другое дело - операция увеличения. Спецификация JVM не имеет набора инструкций для увеличения long типа. Он имеет iinc, но не имеет linc. Таким образом, операция приращения также должна проходить через iinc (что может снова использовать 2 слова, возможно, это также может привести к 2- iinc операциям iinc). В целом, арифметика на long типе немного сложнее по сравнению с тем, что на int типа. Но, конечно, не должно быть слишком много проблем. Наверное, это возможные причины небольшого медленного результата.

0

Оптимизатор Java (Oracle JDK 1.8.0_60) способен преодолевать int-loop, но он не знает, как оптимизировать длинный цикл.

Изменение n от 1000_000_000 до 2000_000_000 не влияет на время выполнения цикла int, но это приводит к тому, что длинный цикл работает в два раза.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню