关键是:优化瓶颈。阅读文件包括:
在这些步骤中,阅读是迄今为止最快的部分(我不确定关闭,它是一个系统调用,但你不必等待它完成)。即使它是整个事物的10%(我认为不是这样),然后将它减少一半只能使性能提高5%,但会以错误评论为代价(这是一件非常糟糕的事情)。对于解析器,抛弃以#开头的行不是有形的减速。之后,评论消失了,所以不会放缓。
现在,想象一下你可以通过剥离所有评论来实际上将“阅读脚本”部分提高5%(这是一个非常乐观的估计,见上文)。在脚本的整体时间消耗中“阅读脚本”的份额有多大?当然,取决于它做了多少,但由于perl脚本通常至少读取一个文件,最多只有50%,但由于perl脚本通常会做更多的事情,所以诚实的估计会将其降低到范围内1%。因此,剥离所有评论的预期效率提升是 在 最 (非常乐观)2.5%,但非常接近0.05%。然后,实际上超过1%的那些已经很快,因为它们几乎什么也没做,所以你再次在错误的点上进行优化。
总结,优化瓶颈。
Perl不是一种与shell脚本相同的脚本语言。解释器不会逐行读取文件。 Perl程序的执行在两个基本阶段完成:编译和运行时[1]。在编译阶段,源代码被解析并转换为字节码。在运行时阶段,字节码在虚拟机上执行。
注释将减慢解析阶段,但与解析脚本本身所需的时间相比,差异可以忽略不计(对于大多数程序来说已经非常小)。关于解析时间的唯一时间是在Web服务器环境中,每秒可以多次调用程序。 mod_perl的存在是为了解决这个问题。
你正在使用 Benchmark 。非常好!您应该寻找改进算法的方法 - 而不是微优化。 Devel :: DProf可能有助于找到任何热点。你绝对 不应该 在错误的尝试中剥离评论以使您的程序更快。你只会让它不可维护。
Benchmark
[1]这通常被称为“及时”编译。 Perl实际上还有几个阶段 INIT 和 END 这没关系。
INIT
END
我希望一个注释只能解析一次,而不是循环多次,所以我怀疑它是一个有效的测试。
我希望这些评论会略微减慢编译速度,但我认为它太小而无法删除它们。
Perl是一种即时编译语言,因此注释和POD对运行时性能没有影响。
注释和POD对编译时间有一个微不足道的影响,但它们对于Perl解析它来说非常容易和快速,几乎不可能测量性能。你可以通过使用自己看到这个 -c 标志只是编译。
-c
在我的Macbook上,一个包含2个语句和1000行70个字符注释的Perl程序需要相同的时间来编译为1000行空注释,只有2个打印语句。一定要运行每个基准测试 两次 允许您的操作系统缓存文件,否则您要进行基准测试的是从磁盘读取文件的时间。
如果启动时间对您来说是一个问题,那不是因为评论和POD。
Perl评论会减慢脚本速度吗?好吧,解析它,是的。解析后执行它?不。解析脚本的频率是多少?只有一次,所以如果你在for循环中有一个注释,那么注释会在脚本运行之前被解析器丢弃一次,一旦它开始运行,注释就已经消失了(并且脚本不是作为脚本内部存储的Perl),因此无论for循环重复多少次,评论都不会产生影响。解析器跳过评论的速度有多快? Perl评论的方式非常快,因此我怀疑你会注意到。如果您有5行代码,并且每行之间有1条Mio注释行,您会注意到更长的启动时间......但是这样做的可能性有多大以及注释有多大用处?
Perl编译脚本然后执行它。注释略微减慢了编译阶段,但对运行阶段没有影响。
来自Paul Tomblins的评论:
perl不进行某种即时编译吗?也许这些评论会被提前废弃?锟绀
是的Perl。
它是编译和解释之间的编程语言。代码即时编译然后运行。评论通常没有任何区别。它可能会产生的最大影响是,当它最初逐行解析文件并预先编译它时,您可能会看到纳秒的差异。