ruby的字串效能到底如何最佳

來源:互聯網
上載者:User
1.先看字串的object_id

str1="Anleb"str2="Anleb"puts str1.object_idputs str2.object_id

輸出:
22952500
22952490

id不同說明,雖然對象的值一樣,但是他們是不同的東西,什麼是不同的東西,也就是指標不同。
str1指標----> 對象
str2指標----> 對象

題外話:不像咱們的c#、java有字串駐留技術,ruby沒有駐留技術的String對象,但是有駐留技術的Fixnum,false,true,不信,我實驗給你看

s1=falses2=falses3=trues4=trues5=1s6=1puts s1.object_idputs s2.object_idputs s3.object_idputs s4.object_idputs s5.object_idputs s6.object_id

 輸出:
0
0
2
2
3
3
駐留技術在ruby也存在,但是不同於其他語言,它是利用“符號”這種技術實現,簡單說一下吧,畢竟這篇不是針對符號來說的:

n1=:"id"n2=:idp n1.object_idp n2.object_id

 輸出:
30498
30498

第一結論:字串多次出現為了效能,能用符號表示盡量用符號表示。

2.再看字串的相加

str1="Anleb"puts str1puts str1.object_id#22952460str1=str1+"boy"puts str1puts str1.object_id#22952430

 說明字串相加是產生新的對象

str1="Anleb"puts str1puts str1.object_id#22952460str1=str1 << "boy"puts str1puts str1.object_id#22952460

 說明利用 << 卻不會New出新的對象,也減少了記憶體的開銷

題外話:+= << concat的效能測試

require 'benchmark'n1="abc"n2="abc"n3="abc"Benchmark.bm do |bm|    bm.report("<<") do          10000.times {n1 << "abc"}    end    bm.report("+=") do          10000.times { n2+="abc"}    end     bm.report("concat") do          10000.times { n3.concat("abc")}    end    end輸出:      user     system      total        real<<  0.000000   0.000000   0.000000 (  0.000000)+=  0.187000   0.063000   0.250000 (  0.266000)concat  0.016000   0.000000   0.016000 (  0.015000)

 
第二結論:字串盡量使用<< 相加,減少開銷。

3.再說"!"
大家都知道方法後面帶 ! 是危險的操作,可是到底為什麼危險呢?

str1="anleb"puts str1puts str1.object_idstr2=str1.capitalizeputs str1puts str2puts str2.object_idstr3=str1.capitalize!puts str1puts str3puts str3.object_id

 輸出:
anleb
22951930
anleb
Anleb
22951910
Anleb
Anleb
22951930

先看id,不帶!返回的是一個新的字串,帶!是返回修改後的原字串本身。

4.最後說字串的複製

str1="Anleb"str2=str1p str1.object_idp str1.object_idstr3=str1.clonep str3.object_idstr4=str1.dupp str4.object_idstr5=String.new(str1)p str5.object_id

 輸出:
22951960
22951960
22951930
22951910
22951890

str1與2相等大家都知道,他們是引用複製,這裡不談論clone、dup、String.new是淺複製還是深度複製。

字串的效能取決於操作字串的記憶體的開銷與否。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.