【问题标题】:Array optimization: what is more expensive?数组优化:什么更贵?
【发布时间】: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


【解决方案1】:

试试看:

#!/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 会因为它的特性而慢得多,尽可能避免它。
【解决方案2】:

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

为了记录,在 Rails 中(或在 require 'activeresource' 之后)您还可以使用 numbers.sum 方法,它的速度大致与 inject 一样快,恕我直言,更具可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2016-08-31
    • 2020-07-25
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多