【问题标题】:Why is string comparison so fast compared to integer comparison?为什么字符串比较比整数比较快?
【发布时间】:2012-02-09 14:38:11
【问题描述】:

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

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

当我实际进行基准测试时,我最终发现完全相反。

首先我生成了 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​​ 中要快得多,我非常感谢您的想法。

【问题讨论】:

    标签: ruby string integer


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        设置交集操作的速度似乎受相交元素数量的影响。

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

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

        当我进行简单的修改时:

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

        (将已知在 w1 中的 755 个项目转储到 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]
        

        希望对大家有所帮助;这两个时间都在我认为的误差范围内,系统上的其他事情可能会导致差异。对于这种长度的字符串,它们本质上是相等的。

        【讨论】:

        • 很好的答案.. 写得好,描述性好。谢谢您的帮助。 :]
        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 2013-05-06
        • 2013-01-02
        • 1970-01-01
        • 2022-03-30
        • 2020-09-15
        • 2020-02-23
        • 2014-07-13
        相关资源
        最近更新 更多