如果array = [1, 2, 3]
,那么从理论上讲,调用array[-1]
和array[2]
之间的速度是否存在差异?
(一般而言,对于array.length == n
的任何数组,调用array[-1]
和array[n-1]
之间是否存在差异?)
答案 0 :(得分:7)
我不是专家,所以基准测试哪一个更快,
require 'benchmark'
require 'bigdecimal/math'
array = (1..10000).to_a
puts Benchmark.measure { puts array[-1] }
#=> 0.000030
puts Benchmark.measure { puts array[10000-1] }
#=> 0.000031
我认为差异可以忽略不计。
答案 1 :(得分:1)
我们应该衡量!我假设[-1]和#last
会比[len - 1]
略快,因为少了一个方法调用。
require 'benchmark/ips'
arr = (1..100).to_a
Benchmark.ips do |x|
x.report("last") { arr.last }
x.report("-1") { arr[-1] }
x.report("len - 1") { arr[arr.length - 1] }
end
结果:
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
$ ruby bench.rb
Calculating -------------------------------------
last 127496 i/100ms
-1 133726 i/100ms
len - 1 127050 i/100ms
-------------------------------------------------
last 6528395.1 (±0.4%) i/s - 32638976 in 4.999622s
-1 7802109.3 (±1.7%) i/s - 39047992 in 5.006745s
len - 1 7046531.5 (±0.3%) i/s - 35319900 in 5.012415s
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
$ ruby bench.rb
Calculating -------------------------------------
last 130228 i/100ms
-1 129587 i/100ms
len - 1 126966 i/100ms
-------------------------------------------------
last 6787424.0 (±0.2%) i/s - 33989508 in 5.007732s
-1 7915058.4 (±0.6%) i/s - 39653622 in 5.010079s
len - 1 7126295.0 (±0.5%) i/s - 35677446 in 5.006563s
$ ruby -v
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on
OpenJDK 64-Bit Server VM 1.8.0_25-b18 +jit [linux-amd64]
$ ruby bench.rb
Calculating -------------------------------------
last 212.085k i/100ms
-1 226.292k i/100ms
len - 1 226.245k i/100ms
-------------------------------------------------
last 13.935M (± 4.4%) i/s - 69.352M
-1 13.696M (± 5.1%) i/s - 68.340M
len - 1 11.732M (± 3.2%) i/s - 58.597M
在红宝石2.0.0和2.1.1下, -1非常快,#last
在JRuby下速度最快(它本身几乎比MRI快2倍,可能是因为那种美味的JIT)。
在所有情况下,它运行非常快,这可能是您应该尝试优化的最后一件事。