【发布时间】:2011-06-26 04:17:06
【问题描述】:
我有一个用于一些数据包处理程序的 std::map。
在分析之前我没有注意到,但不幸的是,仅此地图查找就消耗了大约 10% 的 CPU 时间(称为太多时间)。
通常输入数据中最多只有 10 个键。所以我正在尝试在地图前实现一种键缓存。
键值是 13 位整数。我知道只有 8192 个可能的键和 8192 个项目的数组可以提供恒定的时间查找,但我感到很惭愧,不想使用这种幼稚的方法:(
现在,我只是猜测一些散列方法可以非常快地为 13 位整数产生 4 位代码值。
有什么好主意吗?
提前致谢。
更新
除此之外,我无法完全控制源代码,几乎禁止为此目的创建新数组。
项目经理说(谁运行分析器)链表显示小的性能增益并建议使用 std::list 而不是 std::map。
更新
键的值是随机的(没有关系)并且没有很好的分布。
示例:
1) 0x100, 0x101, 0x10, 0x0, 0xffe
2) 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0xff
【问题讨论】:
-
只需移位和 XOR 3x (12 -> 4 * 3) 并下降一点?或 4x 并称其为“适合以后使用”:-) 现在只需选择 simple 的东西,然后再次分析,看看它是否真的“解决”了问题——或者热点已经转移到哪里. IE。
((x >> 12) ^ (x >> 8) ^ (x >> 4) ^ x) & 0xF -
这更多地取决于您的主要关注点。您担心计算的 CPU 时间。您可以通过使用现在或多或少免费的内存来节省 CPU 时间。查表可能是最好的方法。
-
@thecoshman 但是由于内存局部性/缓存问题(主内存仍然相当“慢”)与一些“便宜”的 CPU 操作......看看两者如何公平会很有趣。
标签: c++ c algorithm data-structures hash