我最优化的一些经常执行Perl代码(每天一次,每文件)。

做的评论慢Perl脚下?我的实验倾向于不:

use Benchmark;
timethese(20000000, {
    'comments' => '$b=1;
# comment  ... (100 times)
', 'nocomments' => '$b=1;'});

让几乎完全相同的价值观(除了从噪音)。

Benchmark: timing 10000000 iterations of comments, nocomments...
  comments:  1 wallclock secs ( 0.53 usr +  0.00 sys =  0.53 CPU) @ 18832391.71/s (n=10000000)
nocomments:  0 wallclock secs ( 0.44 usr +  0.00 sys =  0.44 CPU) @ 22935779.82/s (n=10000000)

Benchmark: timing 20000000 iterations of comments, nocomments...
  comments:  0 wallclock secs ( 0.86 usr + -0.01 sys =  0.84 CPU) @ 23696682.46/s (n=20000000)
nocomments:  1 wallclock secs ( 0.90 usr +  0.00 sys =  0.90 CPU) @ 22099447.51/s (n=20000000)

我得到了类似的结果,如果我跑的评论和意见的版本中作为单独的Perl脚本。

它似乎反直觉的,如果没有别的解释需要读取意见,进入存储器中的每一个时间。

有帮助吗?

解决方案

Perl是一种即时编译语言,因此注释和POD对运行时性能没有影响。

评论和POD对编译时有一个微不足道的影响,但它们对于Perl解析它来说非常容易和快速,几乎不可能测量性能。您可以使用 -c 标志来自行查看。

在我的Macbook上,一个包含2个语句和1000行70个字符注释的Perl程序需要相同的时间来编译为1000行空注释,只有2个打印语句。确保运行每个基准两次以允许您的操作系统缓存文件,否则您的基准测试是从磁盘读取文件的时间。

如果启动时间对您来说是个问题,那不是因为评论和POD。

其他提示

运行时性能?否。

解析和lexing性能?是的,当然。

由于Perl倾向于动态解析和lex,因此注释将影响“启动”。性能

他们会明显地影响它吗?不可能的。

Perl编译脚本然后执行它。注释略微减慢了编译阶段,但对运行阶段没有影响。

Perl不是一种与shell脚本相同的脚本语言。解释器不会逐行读取文件。 Perl程序的执行在两个基本阶段完成:编译和运行时[1]。在编译阶段,源代码被解析并转换为字节码。在运行时阶段,字节码在虚拟机上执行。

注释会减慢解析阶段,但与解析脚本本身所需的时间相比,差异可以忽略不计(对于大多数程序来说,这已经非常小了)。关于解析时间的唯一时间是在Web服务器环境中,每秒可以多次调用程序。 mod_perl的存在是为了解决这个问题。

您正在使用 Benchmark 。非常好!您应该寻找改进算法的方法 - 而不是微优化。 Devel :: DProf可能有助于找到任何热点。绝对不应该在错误的尝试中删除评论,以使您的程序更快。你只会让它无法维护。


[1]这通常被称为“及时”。汇编。 Perl实际上还有几个阶段,如 INIT END ,这些都无关紧要。

点是:优化的瓶颈。阅读一个文件组成:

  • 打开文件,
  • 阅读它的内容,
  • 关闭文件,
  • 分析的内容。

这些步骤,阅读是最快的一部分迄今为止(我不知道关闭,它是一个系统调用的,但是你没必要等待它完成).甚至如果这是10%的整件事(它是不是,我认为),那么减少一半,只给出的5%提高的性能,代价是失踪的意见(这是一个非常坏的事)。为分析器,丢掉一条线,开始#不是有形的经济放缓。和之后,意见都没有了,所以不可能放缓。

现在,想象一下,你其实可以改善"阅读剧本"的一部分通过的5%通过剥所有的意见(这是一个非常乐观的估计,参见上文)。有多大的份额"阅读剧本"的总体时间消费的剧本吗?取决于有多少这样做,当然,但是由于perl脚本,通常至少读一个多文件,有50%在最大,但由于perl脚本通常做更多的东西,一个诚实的估计会使这种下降到的东西的范围在1%以内。因此,预期效率改进的通过剥所有的意见是 大多数 (非常乐观的)的2.5%,但是真正接近于0.05%.然后,那些实际上,它提供了更多于1%都已经快,因为他们几乎什么都没有,所以你们再次优化在错误的要点。

结论,优化的瓶颈。

在这种情况下,Benchmark模块毫无用处。它只是测量一遍又一遍地运行代码的时间。由于您的代码实际上没有执行任何操作,因此大部分代码都会对其进行优化。这就是为什么你看到它每秒运行2200万次。

我在掌握Perl 中几乎涉及到这一章。 Benchmark技术中的测量误差约为7%。你的基准数字在这之内,所以几乎没有区别。

来自Paul Tomblins的评论:

  
    

perl不进行某种即时编译吗?也许这些评论会被提前废弃? –

  

是Perl的确如此。

它是编译和解释之间的编程语言。代码即时编译然后运行。评论通常没有任何区别。它可能会产生的最大影响是,当它最初逐行解析文件并预先编译它时,您可能会看到纳秒的差异。

我希望一条评论只能在循环中解析一次,而不是多次,所以我怀疑它是一个有效的测试。

我希望评论会稍微减慢编辑速度,但我认为这样做太小了,不能去除它们。

Perl评论会减慢脚本速度吗?好吧,解析它,是的。解析后执行它?不。解析脚本的频率是多少?只有一次,所以如果你在for循环中有一个注释,那么注释会在脚本运行之前被解析器丢弃一次,一旦它开始运行,注释就已经消失了(并且脚本不是作为脚本内部存储的Perl),因此无论for循环重复多少次,评论都不会产生影响。解析器跳过评论的速度有多快? Perl评论的方式非常快,因此我怀疑你会注意到。如果您有5行代码,并且每行之间有1条Mio注释行,您会注意到更长的启动时间......但是这样做的可能性有多大以及注释的大小是什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top