Perl:为什么在循环中声明(我的)变量会变慢?

fli*_*ies 6 perl interpreter strict

从解释者的POV到以下程序之间有什么区别:

#!/usr/bin/perl -w

use strict;

for (1..10000000) {
    my $jimmy = $_**2;
}
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/perl -w

use strict;

my $jimmy;
for (1..10000000) {
    $jimmy = $_**2;
}
Run Code Online (Sandbox Code Playgroud)

第一个项目的"时间"报告:

real    0m1.519s
user    0m1.513s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

而对于第二个:

real    0m1.023s
user    0m1.012s
sys     0m0.002s
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 10

myPerl中的声明有两个主要影响; 一个编译时间(其中它在包含子的暂存器上分配一个槽,并确保在适当范围内对该名称的所有引用都解析为该特定的暂存器槽),以及一个运行时一个(其中它重置了一个pad pad to to undef,或者如果你写的那么特定值my $var = foo).

编译时部分当然具有零摊销运行时成本,但每次执行通过my声明时运行一部分运行一次.正如其他人所指出的那样,你的两个例子具有不同的性能,因为它们通常具有不同的语义 - 每次通过循环清除变量,而另一个不循环.