Целочисленная автоматическая распаковка и автобокс дает проблемы с производительностью? - PullRequest
11 голосов
/ 18 мая 2011

В настоящее время мы выполняем некоторые итерации и другие операции, используя x++;, где x - это Integer, а не int.

Операции могут повторяться для некоторых пользовательских операций в нашей системе, но ничего сложного или многочисленного, например, математическое приложение, максимум до 10000 раз за пользовательскую транзакцию.влияет на нашу производительность на несколько заметных миллисекунд ?

Ответы [ 3 ]

17 голосов
/ 18 мая 2011

http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

"Производительность результирующего списка, вероятно, будет низкой, так как он упаковывает или распаковывает данные при каждой операции get или set. Это достаточно быстро для случайного использования, но было бы глупо использовать его во внутреннем средстве, критичном к производительности цикл.

Так, когда вы должны использовать автобокс и распаковку? Используйте их только тогда, когда существует «несоответствие импеданса» между ссылочными типами и примитивами, например, когда вам нужно поместить числовые значения в коллекцию. Не рекомендуется использовать автобокс и распаковку для научных вычислений или другой чувствительный к производительности числовой код. Integer не является заменой для int; Автобокс и распаковка стирают различие между примитивными типами и ссылочными типами, но они не устраняют его. "

1 голос
/ 18 мая 2011

Скорость автобокса зависит от используемой версии JVM, диапазона фактических чисел, с которыми вы работаете, и ваших настроек GC. Смотрите эту действительно интересную углубленную статью о (не) производительности бокса.

По сути, JVM кэширует несколько объектов Integer, поэтому нет необходимости каждый раз создавать «общие». Вы можете настроить этот размер кэша.

Что касается конкретного вопроса: будет ли ваша операция на миллисекунды медленнее, если вы будете использовать примитивы по сравнению с автобоксом? Это полностью зависит от размера списка и от того, как часто он вызывается. Должно быть легко (я думаю!) Проверить производительность примитивной альтернативы.

1 голос
/ 18 мая 2011

Да, это влияет на производительность.Эквивалентный код, созданный для ++x, каждый раз создает новый объект Integer.x++ дополнительно создает временную переменную для хранения предыдущей целочисленной ссылки и некоторых манипуляций.Вы можете убедиться в этом, разобрав файл класса.

...