Пример снижения производительности из-за использования строгих конструкторов данных

Я читаю о строгих конструкторах данных. В связанной статье Wiki говорится, что

«аннотации строгости могут ухудшить производительность [потому что] аннотация строгости заставляет компилятор убедиться, что поле полностью вычислено перед созданием конструктора, и если выяснится, что поле уже было оценено, то это просто напрасная работа».

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

Есть ли пример, иллюстрирующий эту проблему или другие потери эффективности из-за строгости?


person Damian Nadales    schedule 12.01.2017    source источник


Ответы (1)


Принудительное значение, даже если оно уже оценено, имеет небольшую, но существующую стоимость.

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

Если у вас есть такой указатель и вы хотите сохранить его в строгом конструкторе, вы должны сначала его оценить. Это требует проверки младших битов указателя на наличие возможных тегов (трюк для указания оцениваемости). Если тега нет, вы фактически переходите к этому указателю, чтобы ввести преобразователь. Прежде чем вы это сделаете, вы должны поместить в стек кадр возврата, чтобы поток выполнения вернулся к вам в конце. Затем преобразователь оценивает себя, помещает результат в регистр и переходит к адресу возврата. Затем вы можете поместить этот результат в память.

Таким образом, даже если объект, на который вы указываете, уже оценен, вам все равно придется выполнить проверку тега. И я полагаю, что в некоторых случаях оцениваемые вещи не имеют тега (это необязательно), поэтому вся остальная работа все равно может происходить — напрасно.

person Joachim Breitner    schedule 12.01.2017