Spa*_*awk 3 ruby arrays performance
我正在处理一些大型数据集,并试图提高性能。我需要确定一个对象是否包含在一个数组中。我正在考虑使用index或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
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 继承的。这可以解释吗?)
查看 Ruby MRI 源代码,似乎index使用了优化的rb_equal_optwhileinclude?使用rb_equal. 这可以在rb_ary_includes和 rb_ary_index 中看到。这是进行更改的提交。我不是很清楚为什么它被用于index而不是include?
您可能还会发现阅读有关此功能的讨论很有趣