我有一个非常简单的算法,但是出于可读性和正确性,我将其扩展为一堆临时变量。更容易阅读,更改和检查表达式的部分内容。
我的问题是,此代码是否会因为扩展而在运行时被击败?我不知道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
我刚刚完成了从一个看起来讨厌的班轮的扩展,但是发现它是正确的。如果没有理由,我宁愿不要将其放回无法阅读的状态。
答案 0 :(得分:9)
否。
以下程序的编译版本
$ 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);
优化变量可以节省将值复制到变量中的过程,但是将数字标量复制到另一个变量中非常便宜。
我将代码保留为可读形式。可读性比节省几纳秒重要得多。
答案 1 :(得分:5)
通常,Perl永远不会优化变量,而只会优化常量表达式,因为在解析和编译阶段这些变量是已知的,而变量分配则在运行时发生。考虑到这些变量中的任何一个都可以在范围的后面再次使用,或者可以由某些东西引用它们并在其他地方使用。 Perl解析器按顺序工作,因此很难解决。
关于您所关心的问题,除非您要编写具有实时要求的代码(为什么要使用Perl进行此操作?)或者要在数百万次的循环中运行此代码,否则变量声明的开销不会太大关注。子调用更引人注目,方法调用更引人注目,但是低效的算法使这些担忧变得微不足道。如有疑问,请进行基准测试。
答案 2 :(得分:5)
对于您的问题,您已经有了两个很好的答案,但是我想添加一些技巧来提高代码的可读性。
$opt{"buyDollars"}
可以写为$opt{buyDollars}
。$s
中有一个哈希引用。从哈希引用访问值的标准方法是$s->{key}
。您正在使用$$s{key}
可以正常工作,但对于大多数阅读您的代码的人来说,这会非常混乱。