论坛首页 编程语言技术论坛

Ruby代码调整性能优化的几个Tip

浏览 2975 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-27  

    数据都是在我的机器上测试所得,我的机器配置:AMD athlon 64 x2 Dual 4000+ 2.11Ghz,1.87G内存。cruby版本是1.8.6,jruby是1.1RC3。操作系统是xp sp2。

1、将繁忙的循环放在内层,比如下面的代码:

a=0 
for i in 0..1000
  for j in 0..10
     a+=(i+j)
  end
end
  

替换成:

for j in 0..10
   for i in 0..1000
    a+=(i+j)
   end
end
 


cruby提升15%左右,而jruby提升30%以上。

2、乘法运算换成幂运算,cruby降低了200%以上,jruby仅降低30%。也就是说幂运算尽量换算成乘法运算。结论:幂运算换成乘法运算,乘法运算换成加法运算,多数情况下都能对性能有所提高,但请以实际测量为准。

3、100*2 替换成 100<<1,jruby提升8左右%,c ruby提升在0到3%左右。结论:乘以2或者除以2操作可以替换成位移操作,这个调整对性能提高有限,可能以降低代码可读性为代价。

4、字符串累积 a+="abc" 替换成 a<<"abc" c ruby提升接近100%,jruby提升97%

5、将case...when...end语句替换成if...elsif...end语句,cruby没有明显变化(甚至有所降低),而 jruby却提高15%左右。同时,jruby的case...when...end语句的效率比cruby快上60%,if...elsif... end语句比cruby快上50%。结论:使用cruby,用case...when语句为好,而jruby则尽量使用if...elsif

6、将case语句中的频率比较高的分支提前,cruby提升15%左右,jruby也是如此。将if...elsif...end语句中的频率 比较高的部分提前,jruby提升比较少,大概在5%左右,而cruby可以达到10%。。结论:尽管频率高的语句提前,可以适当提升性能,但可以看到也 是有限的,分支语句的顺序不能仅仅考虑频率,更应该兼顾逻辑,维持在同一个抽象层次上。

7、任何一次代码调整,请都要测量一下,这些Tip仅仅是我在我的机器环境下的测试结果。这些调整策略对其他语言也大多有效,我是在读了《代码大全2》代码调整一章后做的测试,并应用到我的代码中了。

   发表时间:2008-03-27  
理论上,求整数次(n)幂 用O(log(n))的那个算法快一点...

有些cpu有求幂运算模块,可以达到比较极限的速度。
自己写太累,所以推荐用matlab的动态链接库...
0 请登录后投票
   发表时间:2008-03-27  
少量语句还能够测试,但是大量的代码堆叠一起的时候,就难以分辨了。
0 请登录后投票
   发表时间:2008-03-28  
"这些Tip仅仅是我在我的机器环境下的测试结果。"

你是用什么进行测试的呢?
0 请登录后投票
   发表时间:2008-03-28  
zengyinbo 写道
"这些Tip仅仅是我在我的机器环境下的测试结果。"

你是用什么进行测试的呢?

benchmark,没有一起测试,分开测试
0 请登录后投票
   发表时间:2008-04-01  
不错的帖子

ps. <<比+=效率高是因为<<没用创建临时对象
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics