¿Cómo puede Rubinius y Jruby ser tan lento?
-
21-12-2019 - |
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?
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.