通过使用callgrind,我发现current bottleneck during a continuous value creation from string stress test is an std::string
dynamic memory allocation.精确的瓶颈是从std :: string :: reserve创建的malloc(…)的调用.
我读过许多现有的JSON库,如rapidjson,使用自定义分配器,以避免在字符串内存分配期间的malloc(…)调用.
我试图分析rapidjson的源代码,但是大量额外的代码和评论,以及我不太确定我正在寻找的事实,没有帮助我.
>自定义分配器在这种情况下如何帮助?
>是内存缓冲区预先分配在某个地方(其中?静态?)和std :: string从中可用内存?
>使用自定义分配器的字符串与普通字符串“兼容”吗?
>他们有不同的类型.他们必须被“转换”吗? (这是否导致性能受到打击?)
代码说明:
str是std :: string的别名.
解决方法
这种事情常常归功于记忆使用与执行速度的老旧的折中.例如:如果您在实际中有一个已知的字符串大小的上限,则可以通过过度分配来提取技巧,以始终适应最大的情况.虽然这浪费了您的内存资源,但它可以减轻更广泛的分配与内存碎片的性能开销.以及为了您的目的进行任何调用realloc基本上恒定的时间.
@sehe是完全正确的.有很多方法
编辑:
为了最终解决你的第二个问题,使用不同的分配器的字符串可以很好地一起播放,并且使用应该是透明的.
例如:
class myalloc : public std::allocator<char>{}; myalloc customAllocator; int main(void) { std::string mystring(customAllocator); std::string regularString = "test string"; mystring = regularString; std::cout << mystring; return 0; }
这是一个相当愚蠢的例子,当然,在引擎盖下使用相同的主机代码.但是,它使用“不同类型”的分配器类显示字符串之间的分配.实现一个有用的分配器,提供STL需要的完整接口,而不用伪装默认的std :: allocator并不是那么简单. This似乎是一个体面的写作涵盖所涉及的概念.至少在你的问题的背景下,为什么这个工作的关键是使用不同的分配器不会导致字符串的类型不同.请注意,自定义分配器作为构造函数的参数而不是模板参数. STL仍然使用模板(例如重新绑定和Traits)来实现有趣的事情,以使分配器接口和跟踪均匀化.