3

ハッシュの配列を反復処理するのにかかる時間を確認することにしました。以下はコードです:

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

時間は、ループ前の現在時間からループ後の現在時間を引いて計算されます。

これは、コード内の計算によると、YARV 2.1.1 で計算にかかった時間です。

0.001962017

Rubinius 2.2.6 でかかった時間は次のとおりです。

0.022598

そしてjRuby 1.7.12

0.022317

おそらく、Rubinius と jRuby は YARV よりもパフォーマンスが優れています。同じ基本操作を実行するのに、なぜ 12 倍近くの時間がかかるのでしょうか? これは正常ですか、それとも何かが不適切に構成されていますか?

4

1 に答える 1

10

環境負荷によって妥協される、あまりにも小さな時間をベンチマークしています。私の経験では、信頼できるベンチマークを得るには、ウォームアップ時間を軽減するために、少なくとも 10 秒のタイミングを取得する必要があります。約 10 秒で、JRuby が最もパフォーマンスが高く、Ruby と Rubinius がそれに続くと予想されます。

どれどれ:

# 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

これは私のマシンでの出力です (私はフィッシュ シェル + rbenv を使用しています。独自のスクリプトを作成する必要があります)。

> 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)

私が推測したように、JRuby は 4.367000 で最速であり、Ruby は 8.188726 で、最後の Rubinius は 14.193565 です。

于 2014-06-05T08:50:48.587 に答える