Чтение исходного кода Function2 I've noticed that @unspecialized было added recently (in scala 2.10). Каковы причины этого и как это влияет на компиляцию? Зачем нам это нужно для функции * tupled
, compose
и некоторыми другими методами?Что такое @unspecialized аннотация?
ответ
Я бы сказал, что безопасно предположить, что он отключает специализацию для целевого метода. Хорошей причиной для отключения специализации является предотвращение набегания байт-кода. Специализация каждого метода без разбора - плохая идея, потому что каждая специализация в основном представляет собой отдельную копию того же метода, а размер байт-кода растет довольно быстро. Поэтому я предполагаю, что специализация Function2
считалась в целом более высокой, чем размер байт-кода, за исключением tupled
и compose
, которые не были достаточно важны, чтобы гарантировать добавочное увеличение. Это тонкий баланс между размером кода и скоростью выполнения, идея состоит в том, чтобы получить наибольшее количество баллов за доллары.
В стороне: в смешной иллюстрации того, как проблематичны коды раздувание, индуцированное specilization может быть, см этого рецепта для бомбы лестницу: