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

我正在处理一些大型数据集,并试图提高性能。 我需要确定对象是否包含在数组中。 我正在考虑使用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 

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

  user system total real include? 0.330000 0.000000 0.330000 ( 0.334328) index 0.040000 0.000000 0.040000 ( 0.039812) 

由于index提供的信息多于include? ,如果有的话,我原本预计它会稍慢一些,尽管事实并非如此。 为什么它更快?

(我知道index直接来自数组类, include?inheritance自Enumerable。可能会解释它吗?)

看看Ruby MRI源代码,似乎index使用优化的rb_equal_optinclude? 使用rb_equal 。 这可以在rb_ary_includes和rb_ary_index中看到。 这是进行更改的提交。 我不清楚为什么它在index使用而不include?

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