Вы микрооптимизируете; попытаться избежать этого. Пойдите с тем, что наиболее читабельно / ремонтопригодно. Обычно это будет та, где вы используете лексическую переменную, поскольку ее имя указывает на ее назначение ... но если вы используете имя типа $data
или $x
, это, очевидно, неприменимо.
С точки зрения технических деталей, для большинства целей вы можете оценить время, затрачиваемое путем подсчета количества основных операций, которые Perl будет использовать. Для вашего $_[0]
поиск элемента в нелексической переменной массива занимает несколько операций: один для получения глоба, один для получения части массива массива, один или несколько для получения индекса (только один для константы) и один, чтобы посмотреть элемент. $hr
, с другой стороны, это одна операция. Чтобы обслуживать прямых пользователей @_, существует оптимизация, которая сокращает количество операций для $_[0]
до единой объединенной операции (когда индекс составляет от 0 до 255 включительно), но в вашем случае она не используется, потому что Контекст deref требует дополнительного флага при поиске элемента массива (для поддержки автовивификации), и этот флаг не поддерживается оптимизированной операцией.
Таким образом, использование лексического будет и более читабельным, и (если вы используете его более одного раза) незаметно быстрее.