2009-10-11 89 views
2

以下哪段代码更昂贵?阵列优化:什么更昂贵?

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

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

这是非常有创意的使用第二种方法:) – pierrotlefou 2009-10-12 02:11:32

+0

+1的第二选择,但你也可以做my_array.sum – Jeet 2012-11-24 06:32:56

回答

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自动累计值。

+0

eval会因为它的表面远慢,避免它,当你可以。 – khelll 2009-10-11 19:48:16

1

作为一个大拇指的规则,eval代码总是比其合理的eval-free替代方法(在这种情况下)慢。如果它处理用户输入,它也可能不安全。

和公正的纪录,铁轨(或require 'activeresource'后),你也可以使用numbers.sum方法,它是大致一样快,注入恕我直言更具可读性。