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

2024-04-06

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

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)

Since index提供的信息多于include?,我原以为它会稍微慢一点,尽管事实并非如此。为什么更快?

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


看看 Ruby MRI 源,似乎index使用优化的rb_equal_opt while include? uses rb_equal。这可以在rb_ary_includes https://github.com/ruby/ruby/blob/c6da45b74cf9d420803c6ccbf4d527b1dfe4014e/array.c#L3851 and rb_ary_index https://github.com/ruby/ruby/blob/c6da45b74cf9d420803c6ccbf4d527b1dfe4014e/array.c#L1462. 是进行更改的提交。我不清楚为什么它被用于index并不是include?

您可能还会发现阅读此内容的讨论很有趣feature https://bugs.ruby-lang.org/issues/8820

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 array.index 比 array.include 快? 的相关文章

随机推荐