用于短弦的升压飞重
Boost flyweight for short strings
我正在实现一个存储和操作大量重复短字符串的系统。例如股票价格序列。我会有很多微软股票价格的重复条目:
<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 ?
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 在用于格式4的arm模拟器中实现功能时的一个问题