c++ - 什么时候应该在 RapidJSON 中使用 CrtAllocator 和 MemoryPoolAllocator?

标签 c++ performance rapidjson

我知道 CrtAllocator是 C 运行时分配器并使用 malloc/realloc/free ,我知道 MemoryPoolAllocator是默认分配器和 allocates memory sequentially .
我不明白为什么 MemoryPoolAllocator被认为比 CrtAllocator 更有效. MemoryPoolAllocator只是默认分配一大块内存,每次都添加条目Parse()叫做?如果是这样,这是否意味着 CrtAllocator来电malloc对于每一个新的Parse() ?
文档为 CrtAllocator 指出了这一点: When there is a lot of add and remove operations, this allocator may be preferred. But this allocator is far less efficient than MemoryPoolAllocator.但它没有解释为什么它比 MemoryPoolAllocator 更适合大量添加/删除或为什么/如何far less efficient than MemoryPoolAllocator .
我关心的主要用例是快速解析来自 Web 的 JSON 响应。我的计划是分配一个大缓冲区并为每个响应重用它。我想我可以使用 ParseInsitu()并每次清除缓冲区。
我在这个用例中使用哪个分配器有关系吗?

最佳答案

如果您只是简单地获取一个巨大的内存块并实现自己的内存池,只需使用 crtAllocator .否则使用 MemoryPoolAllocator它有效地从系统中借用内存并在需要时对其进行 segmentation 。
使用内存池意味着当内存抓取请求发出时,您可以让代码在用户空间中运行,因此没有上下文切换到内核/ protected 模式,也不需要等待内核内存分配器的互斥锁. (除非它需要借用更多内存来满足内存抓取请求,但这不会经常发生)。
需要注意的是,该程序似乎“使用”了比它原本需要的更多的内存;您实际上是在使用大量缓存。此外,如果碎片成为问题,您可能需要注意池如何管理 block 。德尔福等经理FastMM为小型、中型和大型 block 提供不同的区域来缓解这种情况。
在大多数情况下,内存池的任何缺点都不应该成为问题。适度使用一切;)
查看维基百科文章:https://en.wikipedia.org/wiki/Memory_pool

在您的情况下,您可能希望只使用 CrtAllocator 进行初始内存抓取,然后释放它并在需要增长时抓取更大的 block 。如果系统内存受到限制,您可能会考虑在稍后阶段释放它。您甚至可以考虑保留 small blocklarge block这样小块总是常驻的,但你可以让大块来来去去。
这样可以保持较低的内存占用,但还允许您处理大型请求,但如果内存受到限制,也可以拒绝大型请求,同时保留小块,这样您就不会遇到根本没有内存可抓取的情况.

关于c++ - 什么时候应该在 RapidJSON 中使用 CrtAllocator 和 MemoryPoolAllocator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64380492/

相关文章:

Java toString() 使用反射?

reference - rapidjson 对象作为函数参数导致编译器错误

rapidjson - 我可以在rapidjson中区分Integer和Double类型吗

c++ - Flex(Lex) 输出不正确

C++ 1-100 猜谜游戏,其中计算机负责猜谜

c++ - 使用 MSAA 创建交换链失败

秒表和 foreach 循环的 C# *奇怪* 问题

c++ - 如何在布局中安排 QCamera 与其他小部件?

mysql - 复杂的mysql排名!

c++ - RapidJSON/C++ : Better ways to create objects/arrays?