为什么array.index 比array.include 快?

Spa*_*awk 3 ruby arrays performance

我正在处理一些大型数据集,并试图提高性能。我需要确定一个对象是否包含在一个数组中。我正在考虑使用indexinclude?,所以我对两者进行了基准测试。

require 'benchmark'

a = (1..1_000_000).to_a
num = 100_000
reps = 100

Benchmark.bmbm do |bm|
  bm.report('include?') do
    reps.times { a.include? num }
  end
  bm.report('index') do
    reps.times { a.index num }
  end
end
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是(对我来说),index速度要快得多。

               user     system      total        real
include?   0.330000   0.000000   0.330000 (  0.334328)
index      0.040000   0.000000   0.040000 (  0.039812)
Run Code Online (Sandbox Code Playgroud)

由于index提供的信息比 多include?,我本来希望它会稍微慢一点,尽管事实并非如此。为什么它更快?

(我知道它index直接来自数组类,并且include?是从 Enumerable 继承的。这可以解释吗?)

Ale*_*ard 5

查看 Ruby MRI 源代码,似乎index使用了优化的rb_equal_optwhileinclude?使用rb_equal. 这可以在rb_ary_includesrb_ary_index 中看到。是进行更改的提交。我不是很清楚为什么它被用于index而不是include?

您可能还会发现阅读有关此功能的讨论很有趣