Ruby:在一个n元素数组中,它更快:array [-1]或array [n-1]?

时间:2015-03-19 16:35:18

标签: ruby arrays

如果array = [1, 2, 3],那么从理论上讲,调用array[-1]array[2]之间的速度是否存在差异?

(一般而言,对于array.length == n的任何数组,调用array[-1]array[n-1]之间是否存在差异?)

2 个答案:

答案 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)。

在所有情况下,它运行非常快,这可能是您应该尝试优化的最后一件事。