【发布时间】:2009-10-11 14:39:09
【问题描述】:
以下哪段代码更昂贵?
x = my_array.inject {|sum,i| int+=i }
或
x = eval(my_array.join('+'))
【问题讨论】:
-
用第二种方法很有创意:)
-
+1 表示第二个选项,但您也可以执行 my_array.sum
标签: ruby arrays optimization
以下哪段代码更昂贵?
x = my_array.inject {|sum,i| int+=i }
或
x = eval(my_array.join('+'))
【问题讨论】:
标签: ruby arrays optimization
试试看:
#!/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 的第一个参数自动累加值。
【讨论】:
根据经验,eval 代码总是比其合理的无 eval 替代方案(如本例中)慢。如果它处理用户输入,它也可能不安全。
为了记录,在 Rails 中(或在 require 'activeresource' 之后)您还可以使用 numbers.sum 方法,它的速度大致与 inject 一样快,恕我直言,更具可读性。
【讨论】: