+ -
当前位置:首页 → 问答吧 → 有数据有真相,Perl还是很快的~~~

有数据有真相,Perl还是很快的~~~

时间:2010-11-17

来源:互联网

首先用ruby产生一个充满随机数的文件,共500万行,每行7列。

  1. x = Random.new
  2. f = File.open("500w.txt","w")

  3. 5000000.times do |c|
  4.    str = ''
  5.    7.times do |d|
  6.      str << x.rand(10000..99999).to_s + " "
  7.    end
  8.    f.puts str
  9. end
复制代码


执行完后获得500w.txt文件,耗时1分16秒:



QUOTE:
$ time ruby random.rb

real    1m16.227s
user    1m14.022s
sys     0m1.391s



该文件大小和长度:



QUOTE:
$ wc -l 500w.txt
5000000 500w.txt

$ du -h 500w.txt
206M    500w.txt



然后编写一个stat.rb脚本,和一个stat.pl脚本,统计第6列的唯一出现次数。
ruby脚本如下:

  1. hash = Hash.new(0)

  2. File.open("500w.txt").each do |c|
  3.    hash[$2] +=1 if c =~ /^(\S+\s+){5}(\S+)/
  4. end

  5. puts hash.keys.size
复制代码


perl脚本如下:

  1. use strict;

  2. my %hash;
  3. open my $fd,"500w.txt" or die $!;
  4. while(<$fd>) {
  5.     $hash{$2} ++ if /^(\S+\s+){5}(\S+)/;
  6. }
  7. close $fd;

  8. print scalar keys %hash;
复制代码



执行ruby脚本:



QUOTE:
$ time ruby stat.rb
90000

real    0m29.532s
user    0m29.343s
sys     0m0.163s



执行perl脚本:



QUOTE:
$ time perl stat.pl
90000
real    0m19.755s
user    0m19.518s
sys     0m0.229s



ruby的版本:


QUOTE:
$ ruby -v
ruby 1.9.2p0



perl的版本:


QUOTE:
$ perl -v
This is perl, v5.8.8 built for i686-linux



CPU:Xeon CPU 2.8G,多少核不用管了,反正用不着。
内存:物理内存2G,执行过程中未用到交换内存。

总结:ruby比perl慢了1/3。这取决于几方面:
(1)I/O的效率。
(2)Hash的效率。
(3)正则表达式的效率。

结合邮件列表上曾经的相关讨论可认为,是Perl的正则表达式执行效率完全胜出!

作者: 兰花仙子   发布时间: 2010-11-17

仙子有空测试下 5.12 ?5.10的内部实现的改动不知道对性能有什么影响啊

作者: zhlong8   发布时间: 2010-11-17



QUOTE:
仙子有空测试下 5.12 ?5.10的内部实现的改动不知道对性能有什么影响啊
zhlong8 发表于 2010-11-17 18:46




    hoho~~你自己也可以测试下嘛~~
装一个ruby 1.9,不要1.8,慢的要死。

作者: 兰花仙子   发布时间: 2010-11-17