Performance Perl效率-在while(<;>;)循环中测试ARGV

Performance Perl效率-在while(<;>;)循环中测试ARGV,performance,perl,filenames,diamond-operator,Performance,Perl,Filenames,Diamond Operator,当我陈述以下内容时,我的理解是否正确: 在while()循环中测试$ARGV(即文件名)的某些条件是浪费CPU周期的。首先测试文件名,然后在while()循环中相应地处理每一行,效率更高。这样,它就不会在每次抓取一行数据时重复检查文件名 或者菱形操作符是否做了一些魔术,使其与后者一样高效?这是在浪费CPU周期吗 您正在运行Perl。它在虚拟机上运行。您知道一个简单的全局变量查找意味着多少指针解引用吗?你为什么会关心周期/ 虽然操作符确实意味着相当多的魔力,但这并不能优化循环。因此, my $la

当我陈述以下内容时,我的理解是否正确:

在while()循环中测试$ARGV(即文件名)的某些条件是浪费CPU周期的。首先测试文件名,然后在while()循环中相应地处理每一行,效率更高。这样,它就不会在每次抓取一行数据时重复检查文件名

或者菱形操作符是否做了一些魔术,使其与后者一样高效?

这是在浪费CPU周期吗

您正在运行Perl。它在虚拟机上运行。您知道一个简单的全局变量查找意味着多少指针解引用吗?你为什么会关心周期/

虽然
操作符确实意味着相当多的魔力,但这并不能优化循环。因此,

my $lastfile = "";
while (<>) {
  say "file changed to ", $lastfile = $ARGV if $lastfile ne $ARGV;
  print "> $_";
}
我个人觉得这个表单更优雅(单一作业表单),而且它也不会太长。但是在一个快速的oneliner中,我会使用第一个解决方案,因为我的脚本可能已经运行了1000次,而我仍然在编写较长的表单。

作为概念证明(见下文),我在一个10亿行的文件上运行了amon演示的两个脚本(分别命名为poc.pl和poc2.pl)。前者慢了21.7%。总之,这只有在处理大量行时才有意义;在这种情况下,较低级别的语言可能是更好的选择

bash $  wc -l large.log
1000000000 large.log
bash $  time perl poc.pl large.log >/dev/null
  291.16s real   289.89s user     0.73s system
bash $  time perl poc2.pl large.log >/dev/null
  239.29s real   238.58s user     0.53s system

使用
eof
比测试
$ARGV
更好。请参见
perldoc-f eof
bash $  wc -l large.log
1000000000 large.log
bash $  time perl poc.pl large.log >/dev/null
  291.16s real   289.89s user     0.73s system
bash $  time perl poc2.pl large.log >/dev/null
  239.29s real   238.58s user     0.53s system