我正在处理一些大型数据集,并尝试提高性能。我需要确定一个对象是否包含在数组中。我正在考虑使用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(使用前将#替换为@)