Вопрос по Perl-оптимизатору: оптимизирует ли Perl-компилятор все эти временные переменные?

У меня есть довольно простая часть арифметики, но для удобочитаемости и корректности я разложил ее на несколько временных переменных. Проще читать, изменять и изучать отдельные части выражения.

Мой вопрос: будет ли этот код биться во время выполнения только потому, что он расширен? Я не знаю, как работает компилятор perl, но в 'C' или в таком случае эти дополнительные (не совсем) переменные были бы оптимизированы прямо из существования.

my $targetBasis = $$s{"basis"} * $nextBasisPct;
my $dollarsHeld = $$s{"basis"} * $$s{"held"};
my $targetDollars = $dollarsHeld + $opt{"buyDollars"};
my $targetShares = $targetDollars / $targetBasis;
my $newShares = $targetShares - $$s{"held"};
my $targetPrice = $opt{"buyDollars"} / $newShares;

Благодарю.

-E

Я только что закончил расширять это от отвратительно выглядящего одного лайнера, только чтобы найти, что это было правильно. Я бы предпочел не возвращать его в нечитаемое состояние, если для этого нет причин.

3 ответа

Решение

Нет.

Следующая скомпилированная версия программы

$ perl -MO=Concise,-exec a.pl
1  <0> enter
2  <;> nextstate(main 2 a.pl:2) v:*,&,{,x*,x&,x$,$
3  <0> padrange[$s:2,8; %opt:2,8; $targetBasis:2,8] vM/LVINTRO,range=3
4  <;> nextstate(main 3 a.pl:3) v:*,&,{,x*,x&,x$,$
5  <+> multideref($s->{"basis"}) sK/STRICT
6  <+> multideref($s->{"held"}) sK/STRICT
7  <2> multiply[t5] sK/2
8  <0> padsv[$dollarsHeld:3,8] sRM*/LVINTRO
9  <2> sassign vKS/2
a  <;> nextstate(main 4 a.pl:4) v:*,&,{,x*,x&,x$,$
b  <0> padsv[$dollarsHeld:3,8] s
c  <+> multideref($opt{"buyDollars"}) sK
d  <2> add[t7] sK/2
e  <0> padsv[$targetDollars:4,8] sRM*/LVINTRO
f  <2> sassign vKS/2
g  <;> nextstate(main 5 a.pl:5) v:*,&,{,x*,x&,x$,$
h  <0> padsv[$targetDollars:4,8] s
i  <0> padsv[$targetBasis:2,8] s
j  <2> divide[t9] sK/2
k  <0> padsv[$targetShares:5,8] sRM*/LVINTRO
l  <2> sassign vKS/2
m  <;> nextstate(main 6 a.pl:6) v:*,&,{,x*,x&,x$,$
n  <0> padsv[$targetShares:5,8] s
o  <+> multideref($s->{"held"}) sK/STRICT
p  <2> subtract[t11] sK/2
q  <0> padsv[$newShares:6,8] sRM*/LVINTRO
r  <2> sassign vKS/2
s  <;> nextstate(main 7 a.pl:7) v:*,&,{,x*,x&,x$,$
t  <+> multideref($opt{"buyDollars"}) sK
u  <0> padsv[$newShares:6,8] s
v  <2> divide[t13] sK/2
w  <0> padsv[$targetPrice:7,8] sRM*/LVINTRO
x  <2> sassign vKS/2
y  <@> leave[1 ref] vKP/REFC
a.pl syntax OK

Обратите внимание, что сначала я добавил к программе следующее:

use strict;
my ($s, %opt, $targetBasis);

Оптимизация этих переменных позволит сэкономить копирование значения в них, но копирование числового скаляра в другое очень дешево.

Я бы оставил код в удобочитаемой форме. Читаемость гораздо важнее, чем экономить несколько наносекунд.

У вас уже есть пара хороших ответов на ваш вопрос, но я хотел бы добавить пару советов по улучшению читабельности вашего кода.

  • Ключи хеша не нужно заключать в кавычки, если они не содержат пробелов. Так $opt{"buyDollars"}например, можно записать как $opt{buyDollars},
  • Похоже, у вас есть ссылка на хеш $s, Стандартный способ получить доступ к значению из ссылки на хеш $s->{key}, Вы используете $$s{key} который работает, но который будет очень запутанным для большинства людей, читающих ваш код.

В общем, Perl никогда не оптимизирует переменные, только константные выражения, потому что они известны на этапе синтаксического анализа и компиляции, тогда как назначение переменных происходит во время выполнения. Учтите, что любая из этих переменных может быть использована позже в области видимости, или ссылка на них может быть чем-то взята и использована в другом месте. Парсер Perl работает последовательно, так что это будет действительно трудно объяснить.

Что касается ваших проблем, если вы не пишете код с требованием в реальном времени (зачем вам для этого использовать Perl?) Или не запускаете этот код в цикле миллионы раз, накладные расходы на объявление переменных не должны вызывать беспокойства. Вспомогательные вызовы немного более заметны, вызовы методов более заметны, но неэффективные алгоритмы затмевают эти проблемы. В случае сомнений, ориентир.

Другие вопросы по тегам