uint16_t到uint16_t映射的最有效容器

时间:2019-01-18 17:33:48

标签: c++ performance dictionary

我正在为处理能力有限的机器开发程序,我想将uint16_t键映射到uint16_t值。

我当前正在使用std::map进行不安全的阅读:

std::map<uint16_t, uint16_t> m;
//fill m only once

while(true){
    auto x = m[y];
}

性能仍然不能满足要求。在执行速度方面是否有更好的解决方案?

编辑: 一些信息:

  • 项目总数少于500
  • 插入仅完成一次
  • 每秒查询值超过250次
  • 键和值是唯一的
  • Ram非常有限,总体ram为512KB,这部分代码的可用ram小于50KB
  • 100 MHz单核处理器

3 个答案:

答案 0 :(得分:3)

没有关于地图的更多背景信息,

如果您打算使用很多键,那么像以前建议的那样大的数组将很容易处理,因为不会发生冲突,但是如果您不打算使用所有的内存,那可能会很浪费。

如果您打算使用大量数据,但不足以导致太多的哈希冲突,则std :: unordered_map已摊销O(1)查找,并且如果您不关心它们的顺序存储在里面,可能是个不错的猜测。

如果您使用的数据不是很多,并且要求数据灵活,则std :: vector是一个不错的选择

我们所知道的是,这是从uin16_t到uint16_t的地图,没有最佳答案。

答案 1 :(得分:3)

  
      
  • 项目总数少于500
  •   
  • 插入仅完成一次
  •   

如果仅在运行时知道实际大小,则保留键值对的固定大小(500)数组和“有效项数”;用数据填充并排序;那么您只需进行二进制搜索即可。

鉴于元素很少,取决于具体的处理器,仅进行线性搜索甚至会更加方便(如果您碰巧发现了最频繁查找的值,则可能首先保留最常用的元素) 。

答案 2 :(得分:1)

通常,二叉树(您当前使用的std::map)可提供足够的性能。您的CPU预算必须很小。

二进制搜索方法可能不会更快。哈希表(std::unordered_map)可能是解决方案。

请确保正确调整大小,以避免重新散列并保持在1.0负载系数以下。

std::unordered_map<uint16_t, uint16_t> m(503); // 503 is a prime
m.emplace(123, 234);
m.emplace(2345, 345);

std::cout << m.find(123)->second; // don't use operator[] to avoid creating entries
std::cout << m.find(2345)->second;

要检查哈希函数的质量,请调用bucket_size()遍历所有存储桶,并将所有大于1的值相加(即冲突)。