2010-06-29 80 views

回答

3

您可以使用Benchmark module来测试这些类型的东西。我跑@ sepp2k的版本对你原来的代码如下所示:

require 'benchmark' 

class Element 
    attr_accessor :image 

    def initialize(image) 
    @image = image 
    end 
end 

elements = Array.new(500) {|index| Element.new(index)} 

n = 10000 

Benchmark.bm do |x| 
    x.report do 
    n.times do 
     # Globalkeith's version 
     image = [] 
     elements.each {|element| image << element.image} 
    end 
    end 
    # sepp2k's version 
    x.report { n.times do elements.map {|element| element.image} end } 
end 

输出我的机器是一致的(经过3次多运行)非常接近这个上:

user  system  total  real 
2.140000 0.000000 2.140000 ( 2.143290) 
1.420000 0.010000 1.430000 ( 1.422651) 

因此证明map比数组稍大并且操作执行多次时手动追加到数组要快得多。

+0

感谢兄弟,这是一个非常有用的回复! – ktec 2010-07-01 14:10:10

+0

不客气!很高兴我可以帮助:) – 2010-07-01 16:40:16

5
elements.map {|element| element.image} 

这应该具有相同的性能为您的版本,但有些更简洁和更地道。

+2

或符号到过程的热度(假设有问题的版本支持它)'elements.map(&:image)' – thorncp 2010-06-29 23:47:11

+0

刚刚用'elements.map(&:image)'测试过,结果发现与手动追加到数组一样慢! – ktec 2010-07-01 14:19:33