本帖最后由 寒冷魔王 于 2015-1-28 15:26 编辑
RyanBern 发表于 2015-1-28 14:24 ![]()
我的测试结果:
因为机子太慢我改成5000000了TAT
class Test def self.test(string,&block) time = Time.new block.call puts string,Time.new-time end end point = Array.new max = 10000000 Test.test("Push Class Array") { max.times { |i| point.push [i,i] } } Test.test("Include Class Array") { point.include?([max,0]) } # 取最坏情况 Test.test("Do Class Array") { point.each { |p| break if p==[max,0] } # 迭代+判断 } Test.test("Do2 Class Array") { point.each { |p| } } # 纯迭代 Test.test("Do3 Class Array") { point.each { |p| a=p;a==p } } # 赋值+判断自身引用 Test.test("Each_Index Class Array") { point.each_index { |i| } } # Each_Index迭代 #Test.test("Each_Index2 Class Array") { point.each_index { |i| p==[i,i] } } # !!卡死 Test.test("For Class Array") { for i in 0...point.size; end } # For迭代
class Test
def self.test(string,&block)
time = Time.new
block.call
puts string,Time.new-time
end
end
point = Array.new
max = 10000000
Test.test("Push Class Array") { max.times { |i| point.push [i,i] } }
Test.test("Include Class Array") { point.include?([max,0]) } # 取最坏情况
Test.test("Do Class Array") { point.each { |p| break if p==[max,0] } # 迭代+判断 }
Test.test("Do2 Class Array") { point.each { |p| } } # 纯迭代
Test.test("Do3 Class Array") { point.each { |p| a=p;a==p } } # 赋值+判断自身引用
Test.test("Each_Index Class Array") { point.each_index { |i| } } # Each_Index迭代
#Test.test("Each_Index2 Class Array") { point.each_index { |i| p==[i,i] } } # !!卡死
Test.test("For Class Array") { for i in 0...point.size; end } # For迭代
结果
Push Class Array 2.076804 Include Class Array 2.170404 Do Class Array 3.902007 Do2 Class Array 0.624001 Do3 Class Array 1.113064 Each_Index Class Array 0.622035 For Class Array 0.641037
Push Class Array
2.076804
Include Class Array
2.170404
Do Class Array
3.902007
Do2 Class Array
0.624001
Do3 Class Array
1.113064
Each_Index Class Array
0.622035
For Class Array
0.641037
感觉而言,Include 和 迭代+Ruby实现的判断,差不多。
根据以上测试,include效率低下应该是Array自身的判断==问题。
Array先判断是否是自身引用,然后再判断数组元素。
总而言之,Ruby的Array类是个效率非常低的类= = |