哪个脚本语言在vs perl vs python vs ruby​​中表现更好?

时间:2010-12-15 06:18:08

标签: python c ruby perl

到现在为止,我一直在用Perl编写程序。我决定试试python并注意到一些差异。虽然perl内置了ARGV,regex等,但这些必须在python中导入。 我认为这会给python带来性能优势,因为你只是加载你真正需要的东西。

所以,我用每种语言编写了一个演示程序来测试它的性能。

的Perl

#!/usr/bin/perl

exit(1) if $ARGV[-1] ne 'test';
print "Testing...\n";

my $a = 1.0;
my $i;

for (0 .. 500) { $a+=$a/100; }

printf "Result: %.5f\n", $a;

的Python

#!/usr/bin/python

from sys import argv

if argv[-1] != 'test':
   exit(1)

print 'Testing...'

a = 1.0
for i in range(0, 501):
    a+=a/100

print 'Result: %.5f' %a

红宝石

#!/usr/bin/ruby

if ARGV[0] != "test"
 exit(1)
end

print "Testing...\n"
a = 1.0

(0..500).each do a+=a/100 end

printf "Result: %.5f", a

C

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]) {

if (strcmp(argv[1], "test") != 0) return(1);

printf("Testing...\n");

double a = 1.0;
int i;

for (i=0; i <= 500; i++)
   a+=a/100;

printf("Result: %.5f\n",a);
return 0;
}

结果如下:

的Perl

  

真实0m0.006s
  用户0m0.002s
  sys 0m0.004s

的Python

  

真实0m0.075s
  用户0m0.061s
  sys 0m0.013s

红宝石

  

真实0m0.017s
  用户0m0.008s
  sys 0m0.008s

C

  

真实0m0.003s
  用户0m0.001s
  sys 0m0.002s

我的测试在某种程度上存在缺陷吗?

我读过python更适合大型程序(See here)。那么它会超越perl吗?他们的内存使用情况如何?

我正在编写一些大型应用程序作为守护进程在我的VPS上运行,其内存数量有限,因此我的真正目标是最大限度地减少内存使用。

4 个答案:

答案 0 :(得分:6)

有一些问题......

  1. 您的测试没有累积足够的运行时间,您可能主要测试解释器的启动开销,甚至不能非常准确地测量。

  2. 我不在乎Perl或Python是否比Ruby快10倍,我想使用我认为最好的语言...我最有动力写的那个......一个我认为可以编写漂亮的代码。

  3. esr文章很老,当然不包括Ruby。

答案 1 :(得分:3)

关于性能的问题没有一般性答案,基准测试几乎没有任何证据,性能太复杂,无法通过单一测试来判断。 Modern Perl为您提供与任何其他优秀语言一样多的复杂驯服工具,非常适合编写大型程序。

至于内存效率,你可以说语言X的这种实现比语言Y的实现更少占用内存。但在实践中我认为你会根据你的编码方式获得更高的变量。设计。如果你已经精通一种语言,你可能最好使用那种语言,并通过切换到另一种语言为你节省的钱购买额外的内存。 YMMV。

阅读评论后:尝试通过重写为其他语言来减少内存使用情况而不首先分析是疯狂的。

答案 2 :(得分:0)

不,这就是我期望在相对表现方面看到这些语言的地方。

更彻底的OO语言(如Python和Ruby)本质上较慢,这两个特别是因为它们被解释。 (ok python可以编译,但它仍然很慢)

python被认为对大型程序更好的原因是因为它更容易组织为复杂度。保持大量相互关联的perl脚本可管理需要很多严谨。特别是两周后你无法阅读它们。 = O)

在大多数情况下,程序员时间和cpu时间一样重要。

答案 3 :(得分:0)

我能想到的一些问题:

  • 您使用浮动号码。你不知道它是如何在每种语言上实现的(哪个精度?浮点?double?)可能会导致速度/结果差异。

  • 计数太小,你应该做一个嵌套循环使程序运行超过10秒。

例如:

for(0:10000) // change variable depending on what your machine
  for(0:10000)
    // your operation here