Сегодня я стал больше возиться с этим, и я определил, что скалярное присваивание любого типа - дорогостоящая операция по сравнению с издержками одногопоиск по массиву.
Похоже, это просто повторяет первоначальный вопрос, но я чувствую, что нашел больше ясности.Если, например, я изменю свою подпрограмму local_variable для выполнения другого назначения, например, так:
my $index = int(rand(scalar @array));
my $val = 0; # <- this is new
$val = $array[$index];
my $ret = '';
... код подвергается дополнительному штрафу в 5% скорости по сравнению с версией для одного назначения - даже если он ничего не делаетно фиктивное присвоение переменной.
Я также проверил, не вызвало ли область действия настройку / разрыв $var
, чтобы снизить производительность, переключив ее на глобальную, а не на локальную область.Разница незначительна (см. Комментарии к @zdim выше), указывая в сторону от конструкции / разрушения в качестве узкого места производительности.
В конце концов, моя путаница была основана на ошибочные предположения , что скалярное назначение должно быть быстрым .Я привык работать в C, где копирование значения в локальную переменную является чрезвычайно быстрой операцией (1-2 инструкции asm).
Как оказалось, в Perl это не так (хотя яне знаю точно почему, это нормально).Скалярное присваивание является относительно «медленной» операцией ... Что бы ни делали внутренние компоненты Perl, чтобы добраться до n-го элемента объекта Array, на самом деле это довольно быстро по сравнению.«Умножение и сложение», о котором я упоминал в первом посте, по-прежнему гораздо менее трудоемкий, чем код для скалярного присваивания.
Вот почему требуется так много поисков, чтобы соответствовать производительности кэширования результата: просто присваиваниепеременная «кеш» примерно в 7 раз медленнее (для моей настройки).