Perl性能:for(1..200000)vs for($ _ = 1; $ _< = 200000; $ _ ++)

时间:2010-12-01 23:42:18

标签: perl performance memory

for(1..200000) {...} vs for($_=1;$_<=200000;$_++) {...}

第一个是否必须创建一个包含200,000个项目的数组,或者它与第二个项目大致相同?

3 个答案:

答案 0 :(得分:10)

我可以明确地说,for范围($lower .. $upper)不会在内存中创建实际的临时列表。 It did 12 years ago, but not anymore.事实上,它提供了更好的性能,而不是显式C风格的for循环(正如其他人的基准测试所示),因为Perl能够进行计数循环在漂亮,高效的内部代码中。你不应该害怕使用它。

答案 1 :(得分:3)

$ time perl -e '$a=0;for(1..10000000){$a++;}'

real 0m0.523s
user 0m0.520s
sys  0m0.000s

$ time perl -e '$a=0;for($_=1;$_<=10000000;$_++){$a++;}'

real    0m1.309s
user    0m1.300s
sys  0m0.000s

所以前者更快,这表明你的问题的答案是否定的。它很可能在Python中for i in xrange(n)进行了优化。

答案 2 :(得分:2)

我很好奇是不是因为你在第二次增加$_$a,而第一次执行内部增量。

  • time perl -e 'for($_=1;$_<=10000000;){$_++;}'

    real    0m0.544s
    user    0m0.540s
    sys     0m0.000s
    
  • time perl -e 'for($_=1;$_<=10000000;$_++){$a;}'

    real    0m0.593s
    user    0m0.580s
    sys     0m0.000s
    

    都摆脱了额外的变量并且也有更接近的结果,但它们并不等同于原始的例子


与JavaScript类似,反向while循环甚至比第二种方法更快,并且比第一种方法稍慢:

  • time perl -e '$a=0;for($_=10000000;$_--;){$a++;}'

    real    0m0.543s
    user    0m0.530s
    sys     0m0.000s
    
  • time perl -e '$a=0;$_=10000000;while($_--){$a++;}'

    real    0m0.569s
    user    0m0.550s
    sys     0m0.010s
    

    两者都等同于原始的例子;但是,如果你不能退步,它可能无法使用。他们更接近你的第一个结果