与整数比较相比,为什么字符串比较如此之快?

时间:2012-01-13 11:22:00

标签: ruby string integer

在我最近花了一些时间的Ruby项目中,我一直在计算两组大字符串的交集。

根据我的理解,我认为比较整数而不是字符串会很有意义(所有这些字符串都保存在数据库中,我可以很容易地将它们换成ID) / p>

当我实际进行基准测试时,我最终找到了相反的结果。

首先我生成了850个字符串的集合,以及~850个大整数的集合:

r = Random.new
w1 = (1..850).collect{|i| w="";(0..3).collect{|j| (rand*26 + 10).to_i.to_s(35)}.each{|l| w+=(l.to_s)};w}.to_set
w2 = (1..850).collect{|i| w="";(0..3).collect{|j| (rand*26 + 10).to_i.to_s(35)}.each{|l| w+=(l.to_s)};w}.to_set

i1 = (1..2000).collect{|i| (r.rand*1000).to_i**2}.to_set;
i2 = (1..2000).collect{|i| (r.rand*1000).to_i**2}.to_set;

然后我计算了比较时间:

t=Time.now;(0..1000).each {|i| w1 & w2};Time.now-t
=> 0.301727
t=Time.now;(0..1000).each {|i| i1 & i2};Time.now-t
=> 0.70151

我觉得这很疯狂!我一直认为整数比较快得多..

所以我想知道堆栈世界中是否有人知道为什么字符串比较在ruby中更快,我真的很感激听到你的想法。

3 个答案:

答案 0 :(得分:7)

设定交叉点操作的速度似乎受到交叉元素数量的影响。

您的整数创建代码正在创建大量交叉元素,可能是因为它从较小的集合(1000)中选择了2000个条目。

例如,在一次测试中,i1中857个条目中的755个在i2中重复,但w1中849个条目中只有2个在w2中重复。

当我进行简单的改动时:

755.times {|x| w2 << w1.to_a[x]}

(将755个项目转储到已知在w1中的w2中),我系统上的结果显示字符串设置操作更接近等效的整数操作。

我原来的结果是:

1.9.2p180 :006 > t=Time.now;(0..1000).each {|i| w1 & w2};Time.now-t
 => 1.020355
1.9.2p180 :007 > t=Time.now;(0..1000).each {|i| i1 & i2};Time.now-t
 => 2.057535

我的结果是在交叉元素方面使两组集更相似,通过:

1.9.2p180 :051 > 755.times {|x| w2 << w1.to_a[x]}
1.9.2p180 :052 > w2 = w2.to_a[-849..-1].to_set

是:

1.9.2p180 :053 > t=Time.now;(0..1000).each {|i| w1 & w2};Time.now-t
 => 2.014967 
1.9.2p180 :054 > t=Time.now;(0..1000).each {|i| i1 & i2};Time.now-t
 => 2.037542
1.9.2p180 :055 > [i1.length, i2.length, w1.length, w2.length, (i1 & i2).length, (w1 & w2).length]
 => [857, 884, 849, 849, 755, 754]

我希望有所帮助;这两个时间是在我认为的误差范围内,系统上的其他东西可能导致差异。对于这个长度的字符串,它们基本上是相同的。

答案 1 :(得分:3)

它变慢的原因是因为你没有获得尽可能多的匹配项目。需要时间的是建立交集的新数组而不是实际的匹配本身。

答案 2 :(得分:1)

整数比较仍然是最快的 看看这个链接: