[英]C++ Mapping strings to enums - string compare vs. map - performance optimization
在我的代码中,我必须将输入字符串映射到枚举值。 这种映射经常使用,根据性能分析,它是一个瓶颈。 实际上,我将输入字符串与所有可能的字符串值(如果/那么)进行比较,然后返回正确的枚举值。
大约有 50 个不同的值可供比较。
例子:
enum properties_keys {
PROP_EXPANSION,
PROP_DIGITS,
PROP_INVALID,
//others...};
比较功能:
properties_keys convertPropString(std::string input)
{
if (input.compare("prop.expansion") == 0)
return PROP_EXPANSION;
if (input.compare("prop.digits") == 0)
return PROP_DIGITS;
//others...
return PROP_INVALID;
}
替代方法:使用地图
例子:
properties_keys convertPropString(std::string input) {
static std::unordered_map<std::string, properties_keys> const propStrings{
{ "prop.expansion", PROP_EXPANSION},
{ "prop.digits", PROP_DIGITS},
//...
};
auto it = propStrings.find(input);
if (it != propStrings.end()) {
return it->second;
}
else { return PROP_INVALID; }
}
问题:
感谢那里的所有专家。
使用std::unordered_map<std::string, whatever>
意味着为每个字符串文字创建一个字符串,并为每个映射条目创建一个节点。 这是通过动态内存的大量颠簸。
对于一组固定的东西,我倾向于将地图手动滚动为文件范围的元素数组,每个元素由一个const char*
和相应的值组成。 元素按名称手工排序。
struct element {
const char *name;
properties_keys value;
};
element element_map[] = {
{ "prop.digits", PROP_DIGITS },
{ "prop.expansion", PROP_EXPANSION },
...
};
在极少数情况下,当枚举器更改时,您必须管理更改,使所有元素按字母顺序排列。 如果你是偏执狂(你应该是),在启动时做一些事情来检查顺序是否正确。
使用std::binary_search
和适当的谓词查找元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.