为什么Perl比D语言更快?

3

编写简单的“hello world”程序(下面是D语言和Perl语言的代码),在解释语言Perl中比编译语言D中运行速度更快。为什么呢?

//D language (ldc compiler)

import tango.io.Stdout;
void main()
{
    int i=0;
    while (i<1000)
    {
     Stdout("Hola Món").newline;
     i = i+1;
    }
}

并且

my $i = 0;
while ($i<1000)
{
    print "Hola Món\n";
    $i = $i+1;
}

现在的时间是:

time perl hello.pm 

real    0m0.047s
user    0m0.004s
sys 0m0.012s

time ./hola
real    0m0.070s
user    0m0.044s
sys 0m0.012s

为什么?

2
我认为这个问题更适合在Stack Overflow上提问,所以我会标记一下。但是以防万一——那段代码中有99%的系统调用(printf),而且perl可能会对周围的循环进行优化。我建议尝试一些更复杂的东西,不要过度依赖单个系统调用。 - Eduardo Ivanec
@Eduardo 那就是答案。将其作为回答以获取赞,等等。 - jamesbtate
2
请注意,在Perl中,源代码在运行时编译,因此可以比严格解释型语言更快地执行。 - Chris Nava
永远不要尝试使用像“Hello World”这样微不足道的程序进行性能比较。结果永远不会有意义。我记得很多年前看到过类似的东西,“证明”Forth比纯汇编语言更快。 - John Gardeniers
2个回答

6

看起来代码中有99%的系统调用(printf),而且perl可能会对周围的循环进行优化。我建议尝试一些更复杂的东西,不要过度依赖单个系统调用。

此外,perl被优化为快速启动,这是有道理的,因为它部分关注于补充/替代Unix工具箱(sed、awk)。因此,我猜它在像这样的紧凑程序中表现比其他动态语言更好也就不足为奇了。


1
正如 Eduardo 所说,D 在特定情况下使用您的编译器优化效果不佳。“LDC 已经编译了很多 D 代码,但仍应视为 beta 质量。” (摘自 http://www.dsource.org/projects/ldc(强调 added))我的猜测是,相同的 D 代码在 C 中(当然要使用 stdio.h)并且使用优化后进行编译后,由于 syscalls,性能仅略优于 perl,就像 Eduardo 所说的那样。 - jamesbtate
3
为了找出可能的罪魁祸首,如果使用newline语言结构是问题的一部分,我不会感到惊讶;D语言可能正在执行类似于Java的操作,将ab的连接视为new StringBuffer("a").append("b").toString()(而Perl中的连接只是简单地将一堆字节传输出去,因为\n是在编译时处理的)。 - BMDan

2
Perl使用输出缓冲区,所以代码不会执行相同的操作,你的Perl程序需要更少的系统调用。
可以在Perl中尝试$| = 1;来禁用输出缓冲区,或者在D语言中使用stringbuilder以获得更可比较的结果。
此外,D语言中的换行符看起来像是运行时函数调用,可以避免。为了在D语言中获得最大的性能,可以尝试使用静态(编译时)函数并在编译时构建整个字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接