閱讀432 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Ruby性能優化的幾個Tip(update)

數據都是在我的機器上測試所得,我的機器配置:AMD athlon 64 x2 Dual 4000+ 2.11Ghz,1.87G內存。cruby版本是1.8.6,jruby是1.1RC3。操作係統是xp sp2。

1、將繁忙的循環放在內層,比如下麵的代碼:
a=
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

最後更新:2017-05-17 18:01:34

  上一篇:go  關於binary search
  下一篇:go  使用jprofiler監控jruby腳本