【问题标题】:If I shorten the length of each key name in a hash, will that shorten the read/write time of that hash?如果我缩短哈希中每个键名的长度,会缩短该哈希的读/写时间吗?
【发布时间】:2018-12-13 12:05:54
【问题描述】:

我正在构建一个大型散列(约 300,000 个键和值)。我想知道如果我有人类可读的键名,哈希的读/写处理时间是否会改变,比如::some_description_of_the_key,其中一些大约是 30 个字符。

或者将键缩短为序列数字系统(:0_1:1_1 作为基本示例)是否有优势?

假设的优势是每个键的字符长度要短得多。

【问题讨论】:

  • 我看不出使用这些符号有什么好处,因为它们是无效的。例如:0_1 (Syntax Error) 并将它们用作“字符串符号”(:"0_1") 似乎 a) 访问会很烦人; b) 将膨胀内存消耗,因为符号将被实习(并且可能永远不会 GC'd 依赖于 ruby​​ 版本)

标签: ruby-on-rails ruby benchmarking


【解决方案1】:

简而言之,假设您的密钥当前是字符串、数字或符号而不是对象,它会减小大小但不太可能提高性能。如果您的密钥是模型或其他对象,我建议您更改它,因为它确实会增加开销。如果我们谈论的是:

{ my_very_long_key_or_something: “”}

对比

{ 1447 => “” }

那么你节省的字节数等于减少的字符数。因此,对于 300k 条记录,每条记录节省 15 个字符将是 4.29Mb。如果您正在处理低内存并且这种节省是一个好处,那就去吧。不过,我真的建议您公开密钥以使其易于理解。

同样,前提是您的密钥不是对象;您的读/写问题更可能与值的大小(对于对象或嵌套哈希)或您应用于哈希的处理有关。您可以尝试基准测试来比较性能:

Benchmark.ms { my_hash.process }

【讨论】:

  • 请记住,尽管 RAM 很便宜,但 CPU 缓存始终是有限的。根据 Ruby 的存储方式,如果 fluff 稀释了经常访问的数据,那么 L1 / L2 / L3 缓存命中率就会减少。此外,散列较长的字符串可能会稍微慢一些,但如果在实际编译的散列函数之上有很多开销,那么它可能可以忽略不计。
猜你喜欢
  • 2011-11-08
  • 2010-10-31
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2015-12-31
  • 2012-11-09
  • 2019-10-30
相关资源
最近更新 更多