我正在优化一些经常运行的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脚本运行,我会得到类似的结果.
这似乎是违反直觉的,如果没有别的解释器每次都需要将注释读入内存.
运行时性能?没有.
解析和lexing性能?当然是.
由于Perl倾向于动态解析和lex,因此注释将影响"启动"性能.
他们会明显地影响它吗?不太可能.
Perl是一种即时编译语言,因此注释和POD对运行时性能没有影响.
注释和POD对编译时间有一个微不足道的影响,但它们对于Perl解析它来说非常容易和快速,几乎不可能测量性能.你可以通过使用-c
标志来编译来自己看到这个.
在我的Macbook上,一个包含2个语句和1000行70个字符注释的Perl程序需要相同的时间来编译为1000行空注释,只有2个打印语句.确保运行每个基准测试两次以允许您的操作系统缓存文件,否则您要进行基准测试的是从磁盘读取文件的时间.
如果启动时间对您来说是一个问题,那不是因为评论和POD.
Perl编译脚本然后执行它.注释略微减慢了编译阶段,但对运行阶段没有影响.
Perl不是一种与shell脚本相同的脚本语言.解释器不会逐行读取文件.Perl程序的执行在两个基本阶段完成:编译和运行时[1].在编译阶段,源代码被解析并转换为字节码.在运行时阶段,字节码在虚拟机上执行.
注释将减慢解析阶段,但与解析脚本本身所需的时间相比,差异可以忽略不计(对于大多数程序来说,这已经非常小了).关于解析时间的唯一时间是在Web服务器环境中,每秒可以多次调用程序.mod_perl的存在是为了解决这个问题.
你正在使用Benchmark
.非常好!您应该寻找改进算法的方法 - 而不是微优化.Devel :: DProf可能有助于找到任何热点.你绝对不应该在误导性的尝试中剥离评论,以使你的程序更快.你只会让它不可维护.
[1]这通常被称为"及时"编译.Perl中实际上有几个阶段一样INIT
,并END
没有在这里无关紧要.