Оптимизация массива: что дороже? - PullRequest
2 голосов
/ 11 октября 2009

Какой из следующих кусков кода дороже?

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

или

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

Ответы [ 2 ]

12 голосов
/ 11 октября 2009

Попробуйте их:

#!/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 голос
/ 12 октября 2009

Как правило, код eval всегда медленнее, чем его разумная альтернатива без оценки (как в этом случае). Это также потенциально небезопасно, если он обрабатывает пользовательский ввод.

И просто для записи, в Rails (или после require 'activeresource') вы также можете использовать метод numbers.sum, который примерно так же быстр, как inject и IMHO более читабелен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...