Целое автоматическое разблокирование и авто-бокс дает проблемы с производительностью?

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

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

Будет ли этот unboxing и более поздний бокс повлиять на нашу производительность за несколько заметных миллисекунд?

Ответ 1

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

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

Итак, когда вы должны использовать autoboxing и unboxing? Используйте их только при наличии "несоответствия импеданса" между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.

Ответ 2

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

Ответ 3

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

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

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