Pregunta

Decidí ver cuánto tiempo tardaría en iterar a través de una matriz de hashes.A continuación se muestra el código:

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

El tiempo se calcula restando la hora actual después del bucle de la hora actual antes del bucle.

Esta fue la cantidad de tiempo que la computación tomó en YARV 2.1.1, según las matemáticas en el código:

0.001962017

Aquí está cuánto tiempo tomó en Rubinius 2.2.6:

0.022598

y jruby 1.7.12

0.022317

Supuestamente Rubinius y Jruby tienen ventajas de rendimiento sobre YARV.¿Por qué llevan casi 12 veces la cantidad de tiempo para realizar la misma operación básica?¿Es esto normal o tengo algo configurado incorrectamente?

¿Fue útil?

Solución

Usted está evaluando demasiado pequeños tiempos, que están comprometidos por la carga de la entorno.En mi experiencia, para tener puntos de referencia confiables, debe obtener tiempos de al menos 10 segundos, para mitigar los tiempos de calentamiento.Alrededor de 10 segundos, espero que Jruby sea la más actuadora, seguido por Ruby y Rubinius.

Veamos:

# 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

Esta es la salida en mi máquina (uso Fish Shell + RBENV, debe escribir su propio 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)

Como supuse, Jruby es la más rápida con 4.367000, que Ruby con 8.188726 y la última rubinio con 14.193565.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top