我们最近在复杂的检索引擎中更改了基于字符串的 ID 架构,并观察到严重的性能下降。本质上,我们将 ID 从 更改为XXX-00000001到X384840564(有关 ID 架构的详细信息,请参见下文)并遭受几乎翻倍的运行时间。选择不同的字符串哈希函数解决了这个问题,但我们仍然缺乏一个很好的解释。因此,我们的问题是:
为了解决这个问题,我们在下文中提供了 (a) 有关所使用的 ID 模式和哈希函数的详细信息,(b) 一个 Java 中突出性能缺陷的最小工作示例,以及 (c) 我们的性能结果和观察结果。
(尽管描述很长,但我们已经将代码示例大量减少到 4 条性能关键行——参见清单中的第 2 阶段。)
我们的 ID 对象由父 ID 对象([A-Z0-9] 中的 16 个字符的字符串)和子 ID 字符串组成。平均有 1-10 个子 ID 使用相同的父 ID 字符串。例如,旧的孩子 ID有一个三个字母的前缀、一个破折号和一个长度为 8 的零填充运行索引号XXX-00000001(总共 12 个字符;X 可以是任何字母 [AZ])。的新的子ID具有一个字母和9个非连续的数字,例如,X384840564(共10个字符,X可以是任何字母[AZ])。一个明显的区别是旧的孩子 ID 字符串经常重复出现(即字符串ABC-00000002出现多个不同的父 ID,因为运行索引通常以 1) 开头,而带有任意数字组合的新子 ID 通常只出现几次,甚至只出现一个父 ID。
由于 …