gpt4 book ai didi

ruby - 在哈希查找中,符号如何比字符串更快?

转载 作者:行者123 更新时间:2023-12-05 09:18:18 26 4
gpt4 key购买 nike

我理解为什么应该使用符号而不是哈希中的字符串的一方面。也就是说,在内存中只有一个给定符号的实例,而给定字符串可能有多个具有相同值的实例。

我不明白的是,在哈希查找中,符号为何比字符串更快。我看过答案 here , 但我还是不太明白。

如果 :foo.hash == :foo.object_id 返回 true,那么它就有意义了,因为那样它就可以使用该对象id 作为散列的值,并且不必每次都计算它。然而,情况并非如此,:foo.object_id 不等于 :foo.hash。因此我很困惑。

最佳答案

hash 没有义务等同于 object_id。这两件事服务于完全不同的目的。 hash 的要点是尽可能具有确定性和随机性,以便您插入到哈希中的值均匀分布。 object_id 的目的是定义一个唯一的对象标识符,尽管不要求它们是随机的或均匀分布的。事实上,将它们随机化会适得其反,这只会无缘无故地让事情变慢。

符号往往更快的原因是因为它们的内存分配一次(撇开垃圾收集问题)并为同一符号的所有实例回收。字符串不是那样的。它们可以用多种方式构造,甚至两个字节对字节相同的字符串也可能是不同的对象。事实上,除非您确定它们是同一个对象,否则假定它们是比其他方式更安全。

现在在计算hash 时,即使字符串变化很小,值也必须是随机不同的。由于符号无法更改计算,因此可以对其进行更多优化。您可以只计算 object_id 的哈希值,因为它不会改变,例如,而字符串需要考虑其自身的内容,这可能是动态的。

尝试基准测试:

require 'benchmark'

count = 100000000

Benchmark.bm do |bm|
bm.report('Symbol:') do
count.times { :symbol.hash }
end
bm.report('String:') do
count.times { "string".hash }
end
end

这给了我这样的结果:

       user     system      total        real
Symbol: 6.340000 0.020000 6.360000 ( 6.420563)
String: 11.380000 0.040000 11.420000 ( 11.454172)

在这种最简单的情况下,速度可以轻松提高 2 倍。根据一些基本测试,随着字符串变长但符号时间保持不变,字符串代码的性能会降低 O(N)

关于ruby - 在哈希查找中,符号如何比字符串更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com