Domanda

Ho deciso di vedere quanto tempo ci vorrebbe per iteralmente attraverso una serie di hash.Di seguito è riportato il codice:

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
.

Il tempo viene calcolato sottraendo l'ora corrente dopo il loop dall'ora corrente prima del loop.

Questa è stata la quantità di tempo che il calcolo ha preso Yarv 2.1.1, secondo la matematica nel codice:

0.001962017
.

Ecco quanto tempo ci è voluto Rubinius 2.2.6:

0.022598
.

e JRUBY 1.7.12

0.022317
.

presumibilmente Rubinius e Jruby hanno vantaggi prestazionali su Yarv.Perché impiegano quasi 12 volte la quantità di tempo per eseguire la stessa operazione di base?È normale o ho qualcosa configurato in modo improprio?

È stato utile?

Soluzione

Sei il benchmarking troppo minuscoli, che sono compromessi dal carico ambientale.Nella mia esperienza, per avere benchmark affidabili devi ottenere tempi di almeno 10 secondi, al fine di mitigare i tempi di riscaldamento.Circa 10 secondi mi aspetto che Jruby sia il più performante, seguito da Ruby e Rubinio.

Vediamo:

# 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
.

Questa è l'output sulla mia macchina (Io uso il guscio di pesce + rbenv, dovresti scrivere il proprio 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)
.

Come supposto, Jruby è il più veloce con 4.367000, che rubino con 8.188726 e ultimo rubinio con 14.193565.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top