用于短弦的升压飞重

Boost flyweight for short strings

本文关键字:用于      更新时间:2023-10-16

我正在实现一个存储和操作大量重复短字符串的系统。例如股票价格序列。我会有很多微软股票价格的重复条目:

<time1>,MSFT,60.01
<time2>,MSFT,60.02
<time3>,MSFT,60.00

我正在考虑使用Boost::Flyweight来优化内存分配,字符串查找/比较/复制那些小的重复股票代码名称的成本(如MSFT在这种情况下)。

但问题是这些字符串一开始就很小——通常只有几个字节。而在现代计算机中,长类型已经是8字节。在这种情况下使用Boost::Flyweight值得吗?

我对Boost::Flyweight的理解是,它将字符串内化为整数以提高性能。但是我认为查找/比较/复制一个8字节的字符串与操作一个8字节长的数据类型并没有太大的不同。因此,值得为转移到Boost::Flyweight而争吵吗?

我的主要目标是在速度优化方面,而不是内存优化方面,如果我必须选择一个的话。

Flyweight是非常通用和可配置的。

我建议使用从单个固定大小的内存池(例如std::vector<CharType>)分配的字符串的支持。然后,您只需要将std::string_view s返回到后备存储中的字节范围。

你可以使用FlyWeight来配置这样的东西,但我需要找时间来演示它。

或者,你可以"滚你自己的"。我在StackOverflow上有一些例子:

  • 如何提高boost interval_map查找的性能
  • 实现一个"字符串池";保证不移动

我使用Flyweight的经验各不相同(https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight,例如boost multi_index_container和slow operator++)。似乎Flyweight的天真实现很少是您想要的。

UPDATE还记得我为纳斯达克股票代码使用完美散列所做的相关演示吗:是否有可能比使用hashmap更快地将字符串映射到int ?