为什么这个Perl需要花费这么多时间?

时间:2009-11-16 19:12:52

标签: performance perl

我有一个Perl脚本,它通过来自C的system()命令运行。在特定站点(SunOS 5.10)上,当运行该脚本时,它几乎总是需要6秒或更长时间。在其他网站上,它几乎立即运行(0.1秒)。如果我手动运行脚本,即不是从C代码运行,它也会立即运行。我最终跟踪了一个require行的缓慢下降(通过将一大堆时间吐出很多不同的地方)。它需要的文件是我们编写的另一个Perl脚本。该脚本由一个require(此文件here),3个分配了整数值的标量和一些时间/日期转换例程组成。该文件以1;结尾。那个单一的需求似乎有时需要6秒钟,但正如我所说,并不总是在同一台机器上。我绝对难过这里。我唯一的想法是打开分析,但该站点没有Devel :: Profiler,我唯一的其他选项(我知道)将它添加到Perl命令,这将要求我改变并重新编译C代码(可行但非平凡)。

任何人都知道这里会发生什么?我不认为我可以/想要把整个date.pl放在需要的地方,但它几乎和我描述的完全一样;我可以回答你的任何问题。

提前致谢。

3 个答案:

答案 0 :(得分:5)

您可能对Jean-Louis Leroy的A Timely Start感兴趣。他遇到了类似的问题并将其追溯到一个长而深的模块搜索路径,其中perl通常在@INC的最后一个条目中找到模块。

答案 1 :(得分:3)

六秒钟很长一段时间。你有没有检查过你的网络在做什么? 我的第一个想法是在使用system()命令时产生新进程可能是问题,但是六秒太长了。 我对perl知之甚少,但我可以想象,无论出于何种原因,时间模块的访问都可以调用对网络时间服务器的调用。只是为了获得同步。也许这需要很长时间,或者可能会有一段时间。 可能这只发生在新生成的进程中 - 因此只有在使用system()命令时才会发生。

只是疯狂猜测......

答案 2 :(得分:1)

所以,这没有直接回答你的问题,但请告诉我你实际上并没有在perl 4上运行?假设你使用perl 5,你可以删除整个文件并用use POSIX qw(ctime)替换require以获得Perl附带的版本。

如果你确实需要支持perl4,我现在只会抱怨版本5 15岁,然后离开。 :)