Использование longs вместо ints в 64-битной java

В 64-битной виртуальной машине использование longs вместо ints делает лучше с точки зрения производительности, учитывая, что longs составляет 64 бита в java и, следовательно, вытягивание и обработка 64 битное слово может быть быстрее, чем вытягивание 32-битного слова в 64-битной системе. (Я ожидаю много НЕТ, но я искал подробное объяснение).

EDIT. Я подразумеваю, что "вытягивание и обработка 64-битного слова может быть быстрее, чем вытягивание 32-битного слова в 64-битной системе", потому что я предполагаю, что в 64-битной системе потянув 32 битные данные потребуют, чтобы вы сначала получили 64-битное слово, а затем замаскировали верхние 32 бита.

Ответ 1

Использование long для int вероятно, замедлит вас вообще.

Вы сразу заботитесь о том, требует ли int для 64-битного процессора дополнительного времени обработки. Это очень маловероятно на современном конвейерном процессоре. Мы можем легко проверить это с помощью небольшой программы. Данные, которые он использует, должны быть достаточно малы, чтобы входить в кеш L1, поэтому мы проверяем эту конкретную проблему. На моей машине (64-битная Intel Core2 Quad) в принципе нет никакой разницы.

В реальном приложении большинство данных не может находиться в кэшах ЦП. Мы должны беспокоиться о загрузке данных из основной памяти в кеш, который относительно медленный и обычно является узким местом. Такая загрузка работает на единице "строк кэша", которая составляет 64 байта или более, поэтому загрузка одного long или int будет выполняться в одно и то же время.

Однако использование long будет тратить драгоценное пространство кеша, поэтому кэш-промахи будут увеличиваться, что очень дорого. Явное пространство Java также подчеркивается, поэтому активность GC будет увеличиваться.

Мы можем продемонстрировать это, читая огромные массивы long[] и int[] с тем же количеством элементов. Они намного больше, чем могут содержать кеши. Длительная версия занимает больше времени на моей машине на 65%. Тест связан с пропускной способностью memory- > cache, а объем длинной [] памяти на 100% больше. (почему это не занимает 100% больше времени вне меня, очевидно, что другие факторы тоже играют)

Ответ 2

Я всегда использую правильный тип данных на основе вашего проблемного домена.

Я имею в виду, что если вам понадобится 64-битная версия, тогда используйте 64-битную длину, но если вам не нужна 64-битная длина, тогда используйте int.

Использование 32 бит на 64-битной платформе не дорого, и нет смысла делать сравнение, основанное на производительности.

Мне это не выглядит правильно:

for(long l = 0; l<100; l++)
 //SendToTheMoon(l);

И SendToTheMoon не имеет к этому отношения.

Ответ 3

Быть быстрее, может быть медленнее. Зависит от конкретной реализации Java и того, как вы используете эти переменные. Но в целом это, вероятно, недостаточно, чтобы беспокоиться.