【发布时间】:2019-03-15 01:10:51
【问题描述】:
我正在用 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';
}
测量表明 A 代码的运行速度比代码 B 慢大约 3-4 倍。我事先知道代码 A 应该运行得更慢,但我仍然对差异如此之大感到惊讶。还尝试使用 Python 和 Java 运行类似的测试。在 Python 代码中,A 等价物比 B 慢 20%,而 Java 代码或多或少地以相同的速度运行(如预期的那样)。将功能从 sprintf 更改为其他功能并没有显示出任何显着差异。
有什么方法可以帮助 Perl 更快地运行这样的循环?我在这里做错了什么还是 Perl 的特性导致函数调用如此开销?
【问题讨论】:
-
get_string() 究竟是做什么的?
-
@roe 我们假设这是一个存根,而您没有使用
sprintf只是将换行符粘贴到常量字符串上。那将是愚蠢的。那么它到底有什么作用呢? -
奇怪,我的屏幕格式很奇怪,以前没有。火狐混蛋..
-
sprintf 仅用于测试。在实际情况中,函数是多次应用 substr 拆分记录(ASCII 字符串)(在这种情况下解包被证明更慢)。速度差异几乎相同。
标签: performance perl