2011-10-03 40 views
2

我只是测试了一些数组操作,并做了ol'reverse-an-array问题(高级别),看看Ruby的x,y = y,x swap和典型的使用-temperature之间的性能差异-variable-to-swap方法:Ruby的变量swap:x,y = y,x - 对于数组引用似乎比较慢?

# using Ruby's swap 
z = arr.length-1 
for x in 0..(z/2) 
    arr[x], arr[z - x] = arr[z - x], arr[x] 
end 

# using standard temp var 
z = arr.length-1 
for x in 0..(z/2) 
    temp = arr[x] 
    arr[x] = arr[z - x] 
    arr[z - x] = temp 
end 

Ruby的快捷方式交换比较慢了大约40%。我猜测有一些额外的数组引用已完成?但是我没有看到额外的操作会在哪里完成......我只是假定Ruby在幕后做了temp-var-swap。

编辑:这是我使用的基准:

def speed_test(n) 
    t = Time.now 
    n.times do 
    yield 
    end 
    Time.now - t 
end 

tn = speed_test(TIMES) do 
    # code... 
end 

和数组就是:

arr = 10000.times.map 
+1

Ruby很可能为(y,x)创建一个元组对象,然后将该元组解包为x,y的赋值。 – Amber

回答

2

我猜想,这个问题是与你的标杆。第一个循环可能会将所有内容带入缓存。然后第二个循环运行相同的代码,但由于缓存是新鲜的,所以发生的速度更快。

作为一个快速检查,请尝试颠倒两个循环的顺序!

+0

谢谢,我编辑了包含简单测试功能的代码。我按照你的建议做了,结果没有变化。如果数组仅仅是一个基元列表([1,2,3,4 ...]),缓存不应该生效,对吧? – Zando

相关问题