C++17 PMR:: 在 unsynchronized_pool_resource 中设置块数及其大小
C++17 PMR:: Set number of blocks and their size in a unsynchronized_pool_resource
是否有任何规则可以以最有效的方式设置块中的块数 (max_blocks_per_chunk) 和 unsynchronized_pool_resource 中所需的最大块数 (largest_required_pool_block)?
如何避免不必要的内存分配?
例如看看这个demo。
如何尽可能减少发生分配的次数?
池化分配器在 memory waste
与 upstream allocator calls
之间进行权衡。减少一个几乎总是会增加另一个,反之亦然。
最重要的是,使用它们的主要原因之一(至少根据我的经验)是在内存受限的情况下限制或彻底消除长 运行 进程的内存碎片。因此,可以假设“在问题上投入更多内存”往往会适得其反。
因此,这里没有通用的一刀切规则。什么是更可取的总是取决于您的应用程序的需要。
找出 max_blocks_per_chunk
和 largest_required_pool_block
的正确值最好基于全面的内存使用分析,以便实现的平衡尽可能有利于应用程序。
但是,鉴于问题的措辞:
How to avoid unnecessary memory allocations?
How to reduce the number of allocation that take place as much as possible?
如果您想尽可能减少上游分配器调用,那么很简单:
- 使
largest_required_pool_block
成为您期望分配器面对的最大频繁分配大小。更大的块意味着更多的分配将符合合并分配的条件。
- 使
max_blocks_per_chunk
尽可能大,达到任何给定块大小的最大并发分配数。每个块更多的块意味着上游请求之间的更多分配。
唯一的限制因素是您愿意为您的应用程序容忍多少内存占用膨胀。
是否有任何规则可以以最有效的方式设置块中的块数 (max_blocks_per_chunk) 和 unsynchronized_pool_resource 中所需的最大块数 (largest_required_pool_block)?
如何避免不必要的内存分配?
例如看看这个demo。
如何尽可能减少发生分配的次数?
池化分配器在 memory waste
与 upstream allocator calls
之间进行权衡。减少一个几乎总是会增加另一个,反之亦然。
最重要的是,使用它们的主要原因之一(至少根据我的经验)是在内存受限的情况下限制或彻底消除长 运行 进程的内存碎片。因此,可以假设“在问题上投入更多内存”往往会适得其反。
因此,这里没有通用的一刀切规则。什么是更可取的总是取决于您的应用程序的需要。
找出 max_blocks_per_chunk
和 largest_required_pool_block
的正确值最好基于全面的内存使用分析,以便实现的平衡尽可能有利于应用程序。
但是,鉴于问题的措辞:
How to avoid unnecessary memory allocations?
How to reduce the number of allocation that take place as much as possible?
如果您想尽可能减少上游分配器调用,那么很简单:
- 使
largest_required_pool_block
成为您期望分配器面对的最大频繁分配大小。更大的块意味着更多的分配将符合合并分配的条件。 - 使
max_blocks_per_chunk
尽可能大,达到任何给定块大小的最大并发分配数。每个块更多的块意味着上游请求之间的更多分配。
唯一的限制因素是您愿意为您的应用程序容忍多少内存占用膨胀。