2009-10-11 11 views

Répondre

12

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.

+0

eval va être beaucoup plus lent en raison de la nature de celui-ci, évitez-le lorsque vous le pouvez. – khelll

1

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.

Questions connexes