我正在实现一个存储和操作大量重复短字符串的系统。例如股票价格系列。我会有很多微软股票价格的重复条目:
<time1>,MSFT,60.01
<time2>,MSFT,60.02
<time3>,MSFT,60.00
我正在考虑使用 Boost::Flyweight
来优化内存分配、字符串查找/比较/复制那些小的重复代码名称(如本例中的 MSFT)的成本。
但问题是这些字符串一开始就很小——通常只有几个字节。而 long 类型在现代计算机中已经是 8 个字节。在这种情况下是否值得使用 Boost::Flyweight
?
我对 Boost::Flyweight
的理解是,它将字符串内部化为整数以 boost 性能。但我认为查找/比较/复制一个 8 字节的字符串与操作一个 8 字节长的数据类型并没有太大的不同。那么,值得费心地转向 Boost::Flyweight
吗?
我的主要目标更多是在速度优化方面,而不是内存优化方面,如果我必须选择一个的话。
最佳答案
享元非常通用且可配置。
我建议使用从单个固定大小的内存池(例如 std::vector<CharType>
)分配的字符串支持。然后你只需要返回 std::string_view
s 到后备存储中的字节范围。
你可以使用 FlyWeight 来配置这样的东西,但我需要找时间来演示它。
或者,您可以“自己动手”。我在 StackOverflow 上有一些示例:
- How to improve performance of boost interval_map lookups
- Implementing a "string pool" that is guaranteed not to move
我对享元的体验各不相同( https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight ,例如 boost multi_index_container and slow operator++ )。似乎天真的 Flyweight 实现很少是您想要的。
更新 只记得我使用 Perfect Hashing 为 NASDAQ 股票代码制作的相关演示:Is it possible to map string to int faster than using hashmap?
关于c++ - boost 短字符串的轻量级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40285540/