2014-06-04 3 views
3

해시 배열을 반복하는 데 얼마나 오래 걸릴지를 결정했습니다. 아래 코드는 다음과 같습니다.Rubinius와 JRuby는 어떻게 이렇게 느릴 수 있습니까?

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 

시간은 루프 앞의 현재 시간부터 루프 이후의 현재 시간을 뺍니다.

다음
0.001962017 

그것이 Rubinius 2.2.6에 걸린 시간입니다 :

0.022598 

이 코드의 수학에 따라 계산이 YARV 2.1.1에 걸린 시간이었다

그리고 JRuby를이 1.7.12

0.022317 

기발한 Rubinius와 JRuby를가 YARV을 통해 성능 이점이있다. 같은 기본 작업을 수행하는 데 약 12 ​​배의 시간이 걸리는 이유는 무엇입니까? 정상입니까, 아니면 부적절하게 구성된 것이 있습니까?

+0

환경을 시작하는 것을 포함하여 시간을합니까? – MxyL

+2

코드로 들어가서 어느 통역사의 환경이 시작될 지 이해하지 못한다면 어떻게 보이지 않습니다. 코드에서 시간은 현재 시간에서 루프 앞에 Time.now를 빼는 방법으로 계산됩니다. 나는 이것이 이것을 테스트 할 수있는 충분한 방법이라고 생각했다. – Ravenstine

+1

[benchmark/ips] (https://github.com/evanphx/benchmark-ips)를 사용하여 측정을 다시 시도 하시겠습니까? 어쩌면 Java/rbx VM은 워밍업에 더 오랜 시간이 걸릴 것입니다 ... – DMKE

답변

9

너무 작은 벤치마킹이므로 환경 부하로 인해 손상됩니다. 내 경험상 안정적인 벤치 마크를 얻으려면 워밍업 시간을 줄이기 위해 최소한 10 초의 시간을 확보해야합니다. 약 10 초가 지나면 JRuby가 Ruby와 Rubinius가 뒤 따르는 것이 가장 좋다.

보자 :

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

: 이것은 내 컴퓨터에서 출력 (I 물고기 쉘 + rbenv를 사용하여, 당신이 당신의 자신의 스크립트를 작성해야이)

# 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 

입니다 내가 생각하기에 JRuby는 Ruby가 8.188726이고 Rubinius가 14.193565 인 것보다 4.367000에서 가장 빠릅니다.

+0

왜 Rubinius가 그렇게 느린가요? – nurettin

+0

지금 확인하고 싶습니다. – mdesantis

관련 문제