2014-09-11 95 views
2

我正在处理一些大型数据集,并试图提高性能。我需要确定一个对象是否包含在一个数组中。我正在考虑使用indexinclude?,所以我对两者都进行了基准测试。为什么array.index比array.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) 

由于indexinclude?提供更多信息,我会希望它是稍微慢一些,如果有的话,虽然这种情况并非如此。为什么它更快?

(我知道index直接从数组类来临,include?从可枚举继承。也许解释了吗?)

+0

尼斯捕捞的讨论,它不清醒时立即给我。我认为你应该向MRI提交一个问题。 – 2014-09-11 06:02:26

+0

相关:http://stackoverflow.com/questions/23729175/what-is-the-purpose-of-arrayinclude-as-compared-to-arrayindex – sawa 2014-09-11 06:15:12

+0

@undur_gongor谢谢。 [完成](https://bugs.ruby-lang.org/issues/10227)。 – Sparhawk 2014-09-11 06:35:21

回答

4

望着红宝石MRI源,似乎index使用优化rb_equal_optinclude?使用rb_equal。这可以在rb_ary_includesrb_ary_index中看到。 Here是进行更改的提交。为什么它在index使用,而不是include?

您也可能会发现有趣的阅读这种feature