Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为短弦增加飞锤_C++_String_Performance_Boost_Boost Flyweight - Fatal编程技术网

C++ 为短弦增加飞锤

C++ 为短弦增加飞锤,c++,string,performance,boost,boost-flyweight,C++,String,Performance,Boost,Boost Flyweight,我正在实现一个存储和处理大量重复短字符串的系统。例如股票价格系列。我将有大量重复输入的Microsoft股票价格: <time1>,MSFT,60.01 <time2>,MSFT,60.02 <time3>,MSFT,60.00 ,MSFT,60.01 ,MSFT,60.02 ,MSFT,60.00 我正在考虑使用Boost::Flyweight优化内存分配、字符串查找/比较/复制这些小型重复股票代码名称的成本(如本例中的MSFT) 但问题是这些字符串一开

我正在实现一个存储和处理大量重复短字符串的系统。例如股票价格系列。我将有大量重复输入的Microsoft股票价格:

<time1>,MSFT,60.01
<time2>,MSFT,60.02
<time3>,MSFT,60.00
,MSFT,60.01
,MSFT,60.02
,MSFT,60.00
我正在考虑使用
Boost::Flyweight
优化内存分配、字符串查找/比较/复制这些小型重复股票代码名称的成本(如本例中的MSFT)

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

我对
Boost::Flyweight
的理解是,它将字符串内部化为整数以提高性能。但我认为查找/比较/复制一个8字节的字符串与操作一个8字节长的数据类型并没有太大区别。那么,是否值得迁移到
Boost::Flyweight


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

Flyweight非常通用且可配置

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

您可以使用FlyWeight来配置类似的东西,但我需要找时间来演示它

或者,你可以“自己滚”。我在StackOverflow上有一些这样的示例:

我对Flyweight的体验各不相同(例如)。看来Flyweight的天真实现很少是您想要的


更新刚刚记得我用完美散列法制作的纳斯达克股票代码相关演示:

我想到了一些想法:1)我不熟悉Boost的实现,但我觉得flyweight模式主要是为了节省内存,而不是速度。2) 不要忘记缓存位置。flyweight几乎肯定会位于内存的不同部分,而不是“本地”处理的所有其他内容,这意味着缓存未命中。3) 如果您的编译器足够新,那么应该进行小字符串优化,如果字符串足够短,则在堆栈上分配字符串。这可能比flyweight有更大的区别。但是我认为您应该运行一些测试来确定。我同意@0x5453的观点,在这种特殊情况下,将字符串存储为NUL终止的字符数组(例如,
std::array
)可能是性能最好的。当然,这取决于市场的规模allocations@0x5453谢谢你的回复。我觉得这应该是一个答案,而不是评论。:)您是希望id为“MSFT”的对象具有任何函数,还是只存储四个字符的代码?在flyweight模式中,假设特定代码的对象具有更多内容,就像您可以从其flyweight对象中查找有关公司的各种信息一样。此外,您需要跟踪多少不同的四字符代码?例如,如果您知道自己的内存不足65k,那么在为查找表保留足够的空间后,可以将内存存储减半。由于有一个小的flyweight池,您只需找到该对象即可。这并不总是需要指向对象的64位指针。您可以使用一个短int作为查找索引。添加了完美的哈希方法。(另请注意脚注)