• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby做纯计算还是太慢

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

写正题前先罗嗦一句:Google的字库没有校对么?,那么多低级错别字,还不让人删除。至于哪些错别字,三表的文章里有很多搜狗的例子。Google做的改进就是把正确的词排在错误的词前面。我靠,删除缺省词库很难啊?通过统计用户删除的字词不能学到点东西啊?逼良为娼不够厚道,有失和谐吧?

说正题:

这段时间的工作琐碎繁杂。我不胜其烦,工作间隙便在www.projecteuler.net上做题,权当透气换脑。ProjectEuler上的题目都是短小的数字题或词语题。每道题遵循一分钟规则,即程序运行时间不超过1分钟。如果超过了,肯定算法有问题。多数题用几行代码就能解决,不花太多时间,拿得起放得下,不至让人沉迷过深,误了正事,适合休息时自娱自乐。题目做出后,系统便提供相应的论坛链接。看其它人五花八门的解法,也是一大乐趣。间或看到精妙的设计,更是额外的奖励。一般来说C/C++/Pascal(包括Delphi)的程序行数最多,而最短的程序多是用基于栈的语言,比如Forth的变种,J语言。我一般用Ruby。这时就看出单就计算速度而言,Ruby程序(v1.85)和其它语言的巨大差距。比如下面第97题,要求算出质数S8,28433 x 27830457+1,的最后10位数字。顺便说一下,S8是2004年发现的最大non-Mersenne质数。现在已经有更大的了。我先用阳春版的算法,也就是循环7830457次,每次都算出中间结果的最后10位数字。结果cygwin g++编译的程序用了0.66秒(没有打开任何编译优化开关),而Ruby程序用了38.8秒。C++程序运行时,CPU的占用率不到10%,而Ruby轻易上了100%,导致电脑风扇狂转。另外一方面,如果在计算中插入一条打印语句,Ruby的CPU消耗马上降到10%以下。多少可以旁证用Ruby写WEB应用CPU消耗不是问题,因为WEB应用的开销大头还是IO以及网络延迟。

语言
C/C++
Perl
Python
Ruby
耗时(s)
0.661
2.564
6.830
38.809
比较奇怪的是,Python的user时间才0.01秒,系统时间干脆为0。不知道为什么实际时间那么多。
C++程序:
Ruby程序(Windows下的Ruby不能在Cygwin下运行,所以就没有time命令用了):
即使同Python和Perl相比,Ruby也慢了一大截。
Python程序:
Perl程序
当然了,这只是阳春版的算法。我们知道2n里每位数字重复的频率是4x5n-1。这里的n是该数字倒数的位数。比如说22=4, 那我知道26的最后一位数字肯定是4,因为6-2 = 4 = 4 x 51-1。有了这个规律,Ruby的代码就简化为找到当幂为7830456时前十位重复的数字。而这项工作不过是简单的求余。于是性能的差异因为算法的改进而大幅改进。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ruby linux连接windows执行dos命令发布时间:2022-07-14
下一篇:
[ruby]rubyGem出现ERROR: Could not find a valid gem时的处理方法发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap