2013-02-07 39 views
4

Ruby中的字符串是否有任何性能影響?.gsub和/或.sub方法?字符串#gsub鏈的性能影響?

例如,下面是一個Rails源代碼中爲圖像創建alt標記的方法示例。它刪除文件擴展名和摘要(如果有的話)。

def image_alt(src) 
    File.basename(src, '.*').sub(/-[[:xdigit:]]{32}\z/, '').capitalize 
end 

在我的應用程序,我希望它改變下劃線或連字符的空間,所以我想在最後添加一個gsub方法:

def image_alt(src) 
    File.basename(src, '.*').sub(/-[[:xdigit:]]{32}\z/, '').gsub(/(_|-)/, ' ').capitalize 
end 

這是否提高紅旗關於表演還是風格?

+0

從維護的角度來看,我認爲更多的正則表達式,每個正則表達式更小,比單個龐大的正則表達式更好。至於速度,我不確定。 –

+2

嘗試兩種方法並測量性能。或者編寫一個小測試程序並比較實現。真實世界的性能問題通常不在你期望的地方,所以不要過早優化。 –

+2

Ruby包含Benchmark類,它可以很容易地找到這類問題的答案。仔細閱讀示例,撰寫一些測試並在此發佈結果,以便其他人都能學習。 –

回答

7
str.tr('-_', ' ') 

是值得考慮的(doc

+2

作爲參考,請參閱我下面的評論重新:'字符串#tr'與'字符串#gsub'與正則表達式的基準性能。 – nickcoxdotme

+2

有關字符串#tr的一件事是,它不能將字符添加到字符串中,只能替換。所以如果你需要增加字符串的大小,你必須使用.sub或.gsub。 –

0

我沒有問題。我在幾個程序中使用了號碼gsub,我沒有遇到性能問題。我從表演角度不會擔心。就款式而言,我想這是個人喜好。我個人儘量避免使用正則表達式。但是,這只是我。

+0

那麼你會說'.gsub('_','').gsub(' - ','')'? – nickcoxdotme

+3

@nickvoxdotme'.tr('-_','')'值得考慮。 ([doc](http://www.ruby-doc.org/core-1.9.3/String.html#method-i-tr)) – steenslag

+0

他說什麼^^^^。 – BlackHatSamurai

0

當鏈中的正則表達式的匹配項不應該重疊,然後內的條件運行它們在單一StringScanner迭代而輸出其結果到StringIO可能會提高性能。