微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决什么时候应该在RapidJSON中使用CrtAllocator和MemoryPoolAllocator?

我知道CrtAllocator是C运行时分配器,并且使用malloc / realloc / free,并且我知道MemoryPoolAllocator认的分配器和allocates memory sequentially

我不明白为什么MemoryPoolAllocatorCrtAllocator更有效。 MemoryPoolAllocator是否只是认分配一个大内存块,并且每次调用Parse()时都向其中添加条目?如果是这样,这是否意味着CrtAllocator为每个新的malloc调用Parse()

文档针对CrtAllocatorWhen there is a lot of add and remove operations,this allocator may be preferred. But this allocator is far less efficient than MemoryPoolAllocator.指出了这一点,但没有解释为什么与MemoryPoolAllocator相比,对于许多添加/删除来说更好,还是为什么/如何{ {1}}。

我关心的主要用例是快速分析来自Web的JSON响应。我的计划是分配一个大缓冲区,并在每个响应中重用它。我想我可以每次使用far less efficient than MemoryPoolAllocator并清除缓冲区。

在此用例中使用哪个分配器有关系吗?

解决方法

如果您只是一次获取一个巨大的内存块并实现自己的内存池,则只需使用crtAllocator。否则,使用MemoryPoolAllocator可以有效地从系统中借用内存,并在需要时对其进行细分。

使用内存池意味着在发出内存获取请求时,您将代码保持在用户空间中运行,因此无需将上下文切换到内核/受保护模式,也无需等待互斥体。内核的内存分配器。 (除非需要借用更多内存以满足内存获取请求,但这并不常见。。)

需要注意的是,该程序似乎正在“使用”更多的内存,而不是原来需要的;您实际上是在使用庞大的缓存。另外,如果碎片成为问题,您可能还需要注意池管理器如何管理块。诸如Delphi的FastMM之类的管理器为小型,中型和大型区块提供了不同的区域,以缓解这种情况。

在大多数情况下,内存池的任何缺点都不应该成为问题;适度使用一切;)

查看Wikipedia文章:https://en.wikipedia.org/wiki/Memory_pool


在您的情况下,您可能希望只使用CrtAllocator进行初始内存获取,然后释放它并在需要增长时获取更大的内存块。然后,如果系统内存受到限制,则可以考虑在以后释放它。您甚至可能要考虑保留small blocklarge block以便小块始终驻留,但是您可以让大块来去去去。

这可以使内存占用量保持较低,但是还可以让您处理大型请求,并且如果内存受到限制,还可以拒绝大型请求,同时保留较小的块,以免最终导致没有内存可用的情况抓住一切。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。