rubinius和jruby可能是如何缓慢的?
-
21-12-2019 - |
题
我决定看到通过哈希数量迭代需要多长时间。以下是代码:
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
.
和JRUBY 1.7.12
0.022317
.
据称rubinius和Jruby具有优于纱线的性能优势。为什么他们花费近12倍的时间来执行相同的基本操作?是正常的还是我有一些不正确配置的东西?
解决方案
您正在基准测试过于微小的时间,这些时间受到环境负载损害。在我的经验中,为了拥有可靠的基准,您必须获得至少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。
不隶属于 StackOverflow