繁体   English   中英

内存池:它们会提高大于高速缓存行大小的结构的高速缓存使用率吗?

[英]memory pools: will they improve cache usage for structs larger than the cache line size?

据我了解,如果对象小于缓存行的大小,则内存池应该提高通常一起访问的对象的缓存性能-因为相邻的对象很可能同时被提取到缓存中。

但是大于缓存行大小的对象呢? 将此类数据池存储到相同的内存区域有什么好处?

(假设分配/取消分配的时间微不足道,那么我担心的是访问权限...)

谢谢!

使用池的一个重要原因是,它们使分配方案比通用分配器简单得多。 由于所有对象的大小均相同,因此不会产生碎片,您只需要维护一个空闲列表即可。 对于新分配,您尝试从空闲列表的顶部弹出,或者如果列表为空,则增加高水位标记,完成。 (您可以在池内存本身内部的O(1)空间中实现空闲列表。)

但是,池的使用是高度情况,并且是否有任何好处在很大程度上取决于您的实际代码路径和分配要求。 现代标准分配器已经可以很好地使用许多短期的固定大小分配,因此您确实需要分析和检查。

如果您的应用使用大量内存并开始交换内存,那么内存池就有意义。 然后,如果这些对象彼此相邻,它们将一起翻页和翻页。

我之前的项目是一个嵌入式应用程序,带有用于ARM SAM9x平台的内置Web服务器。 它只有64K堆,并且没有任何控制台/显示或文件系统,因此无法仅通过printf()错误将stderr记录或记录到文件中。 虽然如此,它必须能够在7/24正常运行,并且不会因“内存不足”错误而停止运行,它必须能够正常运行。 如果启动一次,它将永远不会停止。 内存不足不是不可恢复的错误,这是系统的完全故障。

因此,我决定不使用new 我曾经使用过对象数组:环形缓冲区,固定大小的池等-并且它可以正常工作。 这些现代语言说,Java(和C#等)使我们错了,内存是一片广阔的海洋,任何人都可以从中受益。 是的,的确是这样,如果您有很多,但是成本很高,就像您在这篇文章中提到的那样。

试试吧! 尽可能少地使用new (和malloc() )。 一个不错的副作用:您不必使用delete (和free() ),就不会有内存泄漏问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM