Question

J'ai décidé de voir combien de temps il faudrait à itérer à travers un tableau de hachages.Ci-dessous le code:

pairs = [{name: "firstname", value: "string"},{name: "lastname", value: "string"},{name: "country", value: "string"},{name: "city", value: "string"},{name: "state", value: "string"},{name: "company", value: "string"},{name: "year", value: "string"},{name: "political_affiliation", value: "string"},{name: "social_security_number", value: "string"}] * 1000
blank = {}

start = Time.now
pairs.each do |pair|
  blank[pair[:name]] = pair[:value]
end

p Time.now - start

Le temps est calculé en soustrayant l'heure actuelle après la boucle de l'heure actuelle avant la boucle.

C'était la quantité de temps que le calcul a pris dans YARV 2.1.1, en fonction des mathématiques du code:

0.001962017

Voici combien de temps il a fallu à Rubinius 2.2.6:

0.022598

et jruby 1.7.12

0.022317

supposément rubinius et jruby ont des avantages de performance sur Yarv.Pourquoi prennent-ils presque 12 fois le temps pour effectuer la même opération de base?Est-ce normal ou ai-je quelque chose de mal configuré?

Était-ce utile?

La solution

Vous faites référence à des moments trop minuscules, qui sont compromis par le chargement d'environnement.Dans mon expérience, afin d'avoir des points de repère fiables, vous devez obtenir des horaires d'au moins 10 secondes, afin d'atténuer les temps d'échauffement.Environ 10 secondes, je m'attends à ce que Jruby soit le plus performant, suivi de Ruby et Rubinius.

Voyons:

# so_24049371.rb

require 'benchmark'

# NOTE THIS: YOU SHOULD TWEAK IT IN ORDER TO HAVE BENCHMARKS OF ~ 10 SECONDS
MULTIPLIER = 5_000_000
pairs = [{name: "firstname", value: "string"},{name: "lastname", value: "string"},{name: "country", value: "string"},{name: "city", value: "string"},{name: "state", value: "string"},{name: "company", value: "string"},{name: "year", value: "string"},{name: "political_affiliation", value: "string"},{name: "social_security_number", value: "string"}] \
  * MULTIPLIER
blank = {}

puts Benchmark.measure {
  pairs.each do |pair|
    blank[pair[:name]] = pair[:value]
  end
}


# so_24049371.fish

source (rbenv init -|psub)

for ruby_version in 2.1.2 rbx-2.2.7 jruby-1.7.12
  rbenv shell $ruby_version
  ruby -v
  ruby so_24049371.rb
end

Ceci est la sortie sur ma machine (j'utilise Fish Shell + RBENV, vous devez écrire votre propre script):

> fish so_24049371.fish
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
  8.190000   0.000000   8.190000 (  8.188726)
rubinius 2.2.7 (2.1.0 build 2014-05-20 JI) [x86_64-linux-gnu]
 14.359762   0.003525  14.363287 ( 14.193565)
jruby 1.7.12 (2.0.0p195) 2014-04-15 643e292 on Java HotSpot(TM) 64-Bit Server VM 1.7.0_55-b13 [linux-amd64]
  4.570000   0.000000   4.570000 (  4.367000)

Comme je suis supposé, Jruby est le plus rapide de 4,367 000, que Ruby avec 8.188726 et le dernier Rubinius avec 14.193565.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top