Подтвердить что ты не робот

Есть ли риск производительности для Collections.unmodifiableList?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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