ruby數組內建方法與自訂方法的效能測試集+1個迴圈問題

來源:互聯網
上載者:User
n=[1,2,3,nil,nil]p nn1=n.compactp n1n2=n.compact!p n2p n

 

主要是交流,水平有限,喜歡研究,多多包涵。

先說一個數組迴圈問題

arr=[1,2,3]n=arr << arrp n輸出: [1, 2, 3, [...]] 

 分析:
<< 傳進去的是一個arr指標 # =>[1,2,3,arr]
其實這是一個迴圈,真實的值是:[1,2,3,[1,2,3,[1,2,3,[1,2,3,........]]]
arr[3]=arr
arr[3][3]=arr

ruby數組比較常用的方法:
1.at方法

arr=[1,2,3]p arr.at(2)p arr[2]

 其實:at比[]方法要效率一點,因為它不接受range參數
測試:

require 'benchmark'n=(1..1000000).to_al=n.lengthBenchmark.bm do |bm|    bm.report("at") do         i=0        while i< l            n.at(i)            i+=1        end    end    bm.report("[]") do         i=0        while i< l            n[i]            i+=1        end    end    end輸出:      user     system      total        realat  0.610000   0.000000   0.610000 (  0.609000)[]  0.625000   0.000000   0.625000 (  0.625000)

 結論:大數組的擷取元素首選at
2.compact delete方法

 

n=[1,2,3,nil,nil]p nn1=n.compactp n1n2=n.compact!p n2p n

 刪除數組中nil的元素,帶!返回數組本身,如果數組中沒有nil,不帶!返回Nil,帶!返回數組本身。

n=[1,2,3,nil,nil]p n.delete(nil)p n

 
delete方法也可以刪除所有nil元素,比較下效能:

require 'benchmark'n=Array.new(100000000,nil)n1=Array.new(100000000,nil)Benchmark.bm do |bm|    bm.report("delete") do         n.delete(nil)    end    bm.report("compact") do        n1.compact    end    end      user     system      total        realdelete  0.718000   0.016000   0.734000 (  0.735000)compact  1.360000   0.062000   1.422000 (  1.453000)

 結論:刪除元素首選 delete

3.比較下for each while

require 'benchmark'n=(1..100000).to_aBenchmark.bm do |bm|    bm.report("each") do         n.each do |d|            d        end    end    bm.report("for") do        for i in n           i       end    end    bm.report("while") do        i=0       while i< n.length           n[i]           i+=1       end    endend      user     system      total        realeach  0.015000   0.000000   0.015000 (  0.015000)for  0.016000   0.000000   0.016000 (  0.016000)while  0.078000   0.000000   0.078000 (  0.078000)

 結論:each 很效率

4.flatten方法

n=[1,2,3]n1=[4,5,6]n2=[n1,n]p n2p n2.flatten#[[4, 5, 6], [1, 2, 3]][4, 5, 6, 1, 2, 3]

 5.sort與自訂方法比較

require 'benchmark'n=(1..100).to_an1=(23..89).to_an2=(900..3003).to_an=n2+n1+n#自訂方法是網上找的def bubble_sort(arr)  1.upto(arr.length-1) do |i|    (arr.length-i).times do |j|      if arr[j]>arr[j+1]        arr[j],arr[j+1] = arr[j+1],arr[j]      end    end  end    arrendBenchmark.bm do |bm|    bm.report("sort") do         n.sort    end    bm.report("personal") do        bubble_sort(n)    end    end      user     system      total        realsort  0.000000   0.000000   0.000000 (  0.000000)personal  3.109000   0.109000   3.218000 (  3.220000)

 結論:坑爹啊,ruby內建方法還是很強大的,首選內建方法sort

6.uniq方法
刪除數組的重複元素,測試就不測了,類似於上面的sort.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.