我写了一个简单的测试用例:
$g = 10
def fun_g a
a += $g
end
def fun_l a
l = 10
a += l
end
def fun_gl a
$gl = 10
a += $gl
end
def test fun
t = Time.now
(10 ** 6).times { |n|
method(fun).call(n)
}
puts(Time.now - t)
end
test :fun_g
test :fun_l
test :fun_gl
结果如下所示。似乎第一个函数fun_g
是最快的,而fun_gl
是最慢的。
1.249626
1.268355
1.30267
但我也得到结果,表明fun_l
是最快的。
1.27436
1.25794
1.303973
理论上,哪一个应该是最快的? 如果我将示例更改为编译语言,结果是否仍然相同?编译器会将局部变量优化为全局变量吗?
答案 0 :(得分:3)
我已将此转换为使用STDLIB benchmark
并获得此结果
require 'benchmark'
iterations = 10 ** 7
$global = 0
local = 0
@instance = 0
Benchmark.bmbm(8) do |x|
x.report('global') {iterations.times { $global } }
x.report('local') {iterations.times { local } }
x.report('instance') {iterations.times { @instance } }
end
结果:
Rehearsal --------------------------------------------
global 1.580000 0.010000 1.590000 ( 1.600952)
local 1.540000 0.000000 1.540000 ( 1.555683)
instance 1.600000 0.000000 1.600000 ( 1.642781)
----------------------------------- total: 4.730000sec
user system total real
global 1.560000 0.000000 1.560000 ( 1.575711)
local 1.540000 0.000000 1.540000 ( 1.547040)
instance 1.600000 0.010000 1.610000 ( 1.618772)
使用benchmark-ips
gem:
require 'benchmark/ips'
$global = 0
local = 0
@instance = 0
Benchmark.ips do |x|
x.report('global') { $global }
x.report('local') { local }
x.report('instance') { @instance }
x.compare!
end
此时在我的机器上提供以下报告,并且可能提供更容易阅读的比较:
Calculating -------------------------------------
global 34.310k i/100ms
local 34.461k i/100ms
instance 34.383k i/100ms
-------------------------------------------------
global 3.154M (± 2.9%) i/s - 15.748M
local 3.205M (± 4.5%) i/s - 15.990M
instance 3.153M (± 3.1%) i/s - 15.747M
Comparison:
local: 3205049.9 i/s
global: 3153595.5 i/s - 1.02x slower
instance: 3152813.3 i/s - 1.02x slower
您只比较了局部变量和全局变量,但忽略了实例变量。
任何一个都有微不足道的差异,这实际上是一件好事。
我不确定这会回答你的问题,但希望有所帮助。