2016-10-27 48 views
1

我正在实现一个存储和操纵大量重复性短弦的系统。例如股票价格系列。我将有很多的微软股价重复的条目:短弦提升轻量级

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

我想用Boost::Flyweight优化内存分配,字符串查找/比较/那些小的重复股票名称的复制成本(如MSFT在这案件)。

但事情是那些字符串开头很小 - 通常只有几个字节。现代计算机中已经有8个字节的长类型。在这种情况下使用Boost::Flyweight值得吗?

我对Boost::Flyweight的理解是,它内部化的字符串是整数以提高性能。但是我认为查找/比较/复制一个8字节的字符串与操作一个8字节的数据类型不会有很大的不同。那么值得移植到Boost::Flyweight的无价值?

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

+0

的一点想法浮现在脑海中:1)我不熟悉Boost的实现,但是我觉得像轻量级模式主要是为了节省内存,而不是速度。 2)不要忘记缓存局部性。轻量级几乎肯定会在内存的不同部分,而不是与“本地”一起工作的任何其他部分,这意味着缓存未命中。 3)如果你的编译器足够新,你应该得到一个小的字符串优化,如果它足够短,它将在栈上分配字符串。这可能会比flyweight有更大的区别。但我认为你应该运行一些测试来确保。 – 0x5453

+0

我同意@ 0x5453在这种特殊情况下,将字符串存储为NUL终止的字符数组(例如'std :: array ')可能是性能最好的。当然,这取决于分配 – sehe

+0

@ 0x5453的分配比例,谢谢您的回复。我觉得这应该不是一个评论的答案。 :) – CodeNoob

回答

0

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

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

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

另外,你可以“滚动你自己的”。我有StackOverflow上的一些样本:

我与飞锤经历变化(https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight,如boost multi_index_container and slow operator++)。看起来Flyweight的幼稚实现很少是你想要的。

UPDATE只记得这个相关的演示中,我使用纳斯达克股票代码完美的混编,制作:Is it possible to map string to int faster than using hashmap?

+0

添加了完美的哈希方法。 (同时注意¹脚注) – sehe