数组优化:什么更贵?

时间:2009-10-11 14:39:10

标签: ruby arrays optimization

以下哪些代码更贵?

x = my_array.inject {|sum,i| int+=i }

x = eval(my_array.join('+'))

2 个答案:

答案 0 :(得分:12)

试试看:

#!/usr/local/bin/ruby -w
require 'benchmark'
iterations = 1000000

Benchmark.bmbm do |bench|
  numbers = (1..100).to_a

  bench.report('inject') do
    x = numbers.inject { |sum, num| sum + num }
  end
  bench.report('eval') do
    x = eval(numbers.join('+'))
  end
end

给出了:

telemachus ~ $ ruby bench.rb 
Rehearsal ------------------------------------------
inject   0.000000   0.000000   0.000000 (  0.000029)
eval     0.000000   0.000000   0.000000 (  0.000261)
--------------------------------- total: 0.000000sec

             user     system      total        real
inject   0.000000   0.000000   0.000000 (  0.000047)
eval     0.000000   0.000000   0.000000 (  0.000186)

但实际上,我认为你是微观优化的。我会使用inject,除非它的效率非常低,因为它是为方法构建的。

另外,我认为inject的代码有两个问题。首先,您不是指int,而是指sum。其次,您只需添加项目,而不是使用+=inject的第一个参数会自动累积值。

答案 1 :(得分:1)

根据经验, eval 代码总是慢于其合理的无eval代码(如本例所示)。如果它处理用户输入,它也可能是不安全的。

只是为了记录,在Rails中(或在require 'activeresource'之后),您还可以使用numbers.sum方法,这与 inject 和IMHO的可读性大致相同。