perl - Perl optimizer question: Will the perl compiler optimize away all of these temporary variables?
问题描述
I've got a pretty simple piece of arithmetic, but for readability and correctness, I've expanded it out into a bunch of temporary variables. It's easier to read, change, and examine partial pieces of the expression.
My question is, will this code take a run-time beating just because it's expanded? I don't know how the perl compiler works, but in 'C', or such, these extra (not quite) variables would be optimized right out of existence.
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;
Thanks.
-E
I just got done expanding this from a nasty looking one liner, only to find that it was correct. I'd rather not put it back to unreadable if there's no reason to do so.
解决方案
不。
以下是程序的编译版本
$ 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);
优化变量可以省去将一个值复制到其中的操作,但是将一个数值标量复制到另一个变量中是非常便宜的。
我会以可读的形式保留代码。可读性远比节省几纳秒更重要。
推荐阅读
- javascript - 查找最近的相似兄弟姐妹
- angular - 需要对 Angular 8 中的同一端点进行多次异步调用
- ruby-on-rails - Ruby on rails,Rubocop 重构
- python - 在 Python 中将转义字符转换为 utf
- python - 使用 gensim.utils.simple_preprocess 的 Python 内存错误
- python-3.x - 如何动态创建函数并根据类的 params 属性使它们使用不同的参数?
- css - CSS Grid:命名行时如何使用 minmax()?
- nestjs - 使用 TypeORM 将列(id)与 NestJS 中的表连接起来
- python-3.x - Pymongo 聚合管道仅返回 100 个文档
- python - 是否可以避免在方法调用中重复相同的 arg-name 和 var-name?