Есть ли риск для производительности Collections.unmodifiableList? - PullRequest
23 голосов
/ 07 июля 2011

Я предложил вернуть Collections.unmodifiableList () вместо прямого возврата переменной-члена, и мой коллега обеспокоен, что это может привести к снижению производительности. Конечно, лучший ответ - это измерить это, и мы можем это сделать, но я хотел бы знать ваш опыт и любые рекомендации, за или против.

Ответы [ 3 ]

25 голосов
/ 07 июля 2011

Нет. По крайней мере, реализация OpenJDK буквально «заменяет» методы модификации на UnsupportedOperationException s, остальные добавляют один уровень косвенности, который должен быть просто оптимизирован компилятором VM ( и даже в этом случае один уровень косвенности не будет дорогостоящим).

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

7 голосов
/ 07 июля 2011

Если вы посмотрите на реализацию, то увидите, что Collections.unmodifiable - это просто тонкая оболочка вокруг реальной коллекции, которая выдает исключение для всех методов удаления / добавления вместо пересылки. Поэтому нет никакого снижения производительности (вызов переадресации будет встроен JIT).

Так что да, вы, безусловно, должны возвращать немодифицируемую коллекцию вместо оригинальной в большинстве случаев - гораздо лучшая практика кодирования.

3 голосов
/ 07 июля 2011

Если JIT включает функции, нет.Если этого не произойдет, то да, произойдет небольшое снижение производительности, но вы, скорее всего, не сможете заметить это , если у вас очень узкий цикл.

Скорее всего, он будет встроен в функцию, если, возможно, вы не скомпилируете для отладки.

...