为什么array.index比array.include更快?
我正在处理一些大型数据集,并试图提高性能。 我需要确定对象是否包含在数组中。 我正在考虑使用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
令人惊讶的是(对我来说), 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_opt
而include?
使用rb_equal
。 这可以在rb_ary_includes和rb_ary_index中看到。 这是进行更改的提交。 我不清楚为什么它在index
使用而不include?
您可能还会发现阅读此function的讨论很有趣
- 在Rails中安排一次性工作
- 为什么安装bson_ext会出错?
- Watir不适用于Ruby 1.9.3
- Rails:has_many通过命名空间模型无法正确返回
- 在Ruby中为属性创建别名的最佳方法是什么?
- 使用Nokogiri构建器创建带有命名空间根元素的XML文档
- 按值排序哈希然后按键排序(但键是相反的)
- Ruby On Rails Active Admin has_many更改文本以使用不同的列
- SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv2 / v3读取服务器hello A – Faraday :: Error :: ConnectionFailed