繁体   English   中英

C++ 将字符串映射到枚举 - 字符串比较与映射 - 性能优化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM