Будет ли использование длинных вместо целых выгод в 64-битной Java

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

РЕДАКТИРОВАТЬ: я подразумеваю, что "извлечение и обработка 64-разрядного слова может быть быстрее, чем извлечение 32-разрядного слова в 64-разрядной системе", потому что я предполагаю, что в 64-разрядной системе извлечение 32-разрядных данных потребует от вас сначала получить 64 битное слово, а затем замаскировать верхние 32 бита.

3 ответа

Решение

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

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

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

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

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

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

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

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

Для меня это выглядит не так:

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

А также SendToTheMoon не имеет к этому никакого отношения.

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

Другие вопросы по тегам