我正在用Perl写一个文件解析器,所以不得不循环遍历文件。文件由固定长度的记录组成,我想创建一个单独的函数来解析给定的记录并在循环中调用该函数。但是,最终的结果转变为大文件缓慢,我的猜测是我不应该使用外部函数。所以,我有和没有在一个循环中的函数调用进行了一些虚拟测试:为什么Perl中的函数调用循环如此缓慢?
[A]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[B]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
测量表明,代码运行约3-4倍比代码B慢。我事先知道代码A应该运行得更慢,但是我仍然惊讶地发现差别很大。还试图用Python和Java运行类似的测试。在Python代码中,相当于比B慢20%,并且Java代码以相同的速度运行(如预期的那样)。从sprintf更改功能到别的没有显示任何显着差异。
有什么方法可以帮助Perl更快地运行这样的循环吗?我在这里做了些什么总是错误的,还是Perl的功能,函数调用是这样的开销?
什么,准确地说,它get_string()呢? – eruciform 2010-07-15 12:34:24
@roe我们假设这是一个存根,并且你没有使用'sprintf'只是将一个换行符粘贴到一个常量字符串上。那会很愚蠢。那么它究竟做了什么? – Schwern 2010-07-15 20:32:55
奇怪,我的屏幕格式奇怪,它之前没有。 firefox goof .. – eruciform 2010-07-15 21:09:59