Lequel des codes suivants est le plus cher?Optimisation de tableau: qu'est-ce qui est le plus cher?
x = my_array.inject {|sum,i| int+=i }
ou
x = eval(my_array.join('+'))
Lequel des codes suivants est le plus cher?Optimisation de tableau: qu'est-ce qui est le plus cher?
x = my_array.inject {|sum,i| int+=i }
ou
x = eval(my_array.join('+'))
Essayez-les:
#!/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
Ce qui donne:
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)
Mais en fait, je pense que vous êtes micro-optimisation. J'utiliserais inject
à moins que ce ne soit vraiment inefficace, puisque c'est pour cela que la méthode a été conçue.
Aussi je pense que votre code pour inject
a deux problèmes. Tout d'abord, vous ne voulez pas dire int
, vous voulez dire sum
. Deuxièmement, vous pouvez simplement ajouter les éléments, plutôt que d'utiliser +=
. Le premier paramètre à inject
accumule automatiquement la valeur.
eval va être beaucoup plus lent en raison de la nature de celui-ci, évitez-le lorsque vous le pouvez. – khelll
En règle générale, d'un pouce, eval le code est toujours plus lent que son alternative sans eval raisonnable (comme dans ce cas). Il est également potentiellement non sécurisé s'il traite les entrées de l'utilisateur.
Et pour l'enregistrement, dans Rails (ou après require 'activeresource'
), vous pouvez également utiliser la méthode numbers.sum
, qui est à peu près aussi vite que injectent et à mon avis plus lisible.
Il est très créatif d'utiliser la deuxième méthode :) – pierrotlefou
+1 pour la deuxième option, mais vous pouvez également faire my_array.sum – Jeet