【发布时间】:2011-05-18 20:01:12
【问题描述】:
for(1..200000) {...} 与 for($_=1;$_<=200000;$_++) {...}
第一个必须创建一个包含 200,000 个项目的数组,还是与第二个差不多?
【问题讨论】:
-
何不试试看?
-
解释这件事的文档的哪一部分你不明白?
标签: perl performance memory
for(1..200000) {...} 与 for($_=1;$_<=200000;$_++) {...}
第一个必须创建一个包含 200,000 个项目的数组,还是与第二个差不多?
【问题讨论】:
标签: perl performance memory
$ 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
所以前者更快,这表明您的问题的答案是否定的。它很可能已优化为 for i in xrange(n) 在 Python 中。
【讨论】:
我很好奇是不是因为您在第二个中增加了 $_ 和 $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
两者都等同于原始示例;但是,如果您不能后退,它可能无法使用。他们更接近你的第一个结果
【讨论】:
我可以肯定地说,for 具有范围 ($lower .. $upper) 不会在内存中创建实际的临时列表。 It did 12 years ago, but not anymore. 事实上,它比显式 C 风格的 for 循环提供了 更好 的性能(正如其他基准所显示的那样),因为 Perl 能够很好地完成计数循环,高效的内部代码。你不应该害怕使用它。
【讨论】:
for (1..n) 在所有类别中获胜。