【发布时间】:2011-10-15 04:31:25
【问题描述】:
我有一个将一个整数转换为另一个整数的代码模式。就像这样:
int t(int value) {
switch (value) {
case 1: return const_1;
case 3: return const_2;
case 4: return const_3;
case 8: return const_4;
default: return 0;
}
}
目前大约有 50 个条目,以后可能会更多,但可能不会超过一百或两个。所有的值都是预定义的,当然我可以按它们的值排序 case 标签。所以问题是,什么会更快 - 这种方法或将其放入哈希映射(我无法访问 std::map,所以我说的是我的 SDK 中可用的自定义哈希映射)并在该表中执行查找?不过,也许这有点过早的优化......但我只需要你的意见。
提前致谢。
编辑:我的案例值将在 0 到 0xffff 的范围内。以及关于哈希映射更好可读性的点。我不确定它是否真的具有更好的可读性,因为我仍然需要用值填充它,所以我的代码中仍然需要有一张常量映射表。
EDIT-2:已经给出了许多有用的答案,非常感谢。我想在这里添加一些信息。我的散列键是整数,而我的整数散列函数基本上只是一个整数溢出的乘法:
EXPORT_C __NAKED__ unsigned int DefaultHash::Integer(const int& /*aInt*/)
{
_asm mov edx, [esp+4]
_asm mov eax, 9E3779B9h
_asm mul dword ptr [edx]
_asm ret
}
所以应该很快。
【问题讨论】:
-
你不应该真的从空虚中返回,是的,这是过早的优化,但我个人会选择好的哈希图(出于可重复性的原因)
-
(1)
std::map不是哈希图(来自 C++11 的std::unordered_map是)。 (2) 我们应该如何判断自定义哈希映射的质量?它可能完全是垃圾,也可能非常出色。 -
顺便说一句,也许考虑一个带有命名对的
enum而不是switch?这将完全摆脱函数调用。 -
@Haspemulator 和默认值呢?
-
@delnan:是的,我知道您无法判断自定义地图的质量。但是让我们假设它是一个好的哈希映射。
标签: c++ performance hashmap switch-statement