免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9571 | 回复: 5
打印 上一主题 下一主题

有数据有真相,Perl还是很快的~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-17 18:31 |显示全部楼层 |倒序浏览
首先用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秒:

$ time ruby random.rb

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


该文件大小和长度:

$ 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脚本:

$ time ruby stat.rb
90000

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


执行perl脚本:

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


ruby的版本:
$ ruby -v
ruby 1.9.2p0


perl的版本:
$ 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的正则表达式执行效率完全胜出!

论坛徽章:
0
2 [报告]
发表于 2010-11-17 19:50 |显示全部楼层
仙子有空测试下 5.12 ?5.10的内部实现的改动不知道对性能有什么影响啊
zhlong8 发表于 2010-11-17 18:46



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

论坛徽章:
0
3 [报告]
发表于 2010-11-17 20:49 |显示全部楼层
回复  兰花仙子


    主要多版本共存不知道有没什么好的解决办法 win 下
zhlong8 发表于 2010-11-17 20:40



    win下不清楚。。linux下安装perl可以指定--prefix,安装到不同目录。

论坛徽章:
0
4 [报告]
发表于 2010-11-18 09:24 |显示全部楼层
ruby 1.9还是慢?仙子看来是打击我了。
2gua 发表于 2010-11-18 07:11



    你可以测试下啦~~~
还有py谁也可以测试下。

论坛徽章:
0
5 [报告]
发表于 2010-11-19 17:27 |显示全部楼层
像仙子这种程序大部分是靠IO,perl的IO是非常快的, 我对比过java和ruby的,的确快很多
chenzq1604 发表于 2010-11-19 17:22



    我记得邮件列表上讨论过,perl的正则表达式是机器码的裸字节流匹配,RE快过ruby是正常的。

论坛徽章:
0
6 [报告]
发表于 2010-11-22 21:58 |显示全部楼层
如果天资一般的话,ruby或者java比较靠谱一些,因为后者的结构比较整齐


这个。。持保留意见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP