以下哪些代码更贵?
x = my_array.inject {|sum,i| int+=i }
或
x = eval(my_array.join('+'))
答案 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的可读性大致相同。