我需要为一个非常大的数组中的所有entires设置一些默认值。 它花了我很长的时间(110-120毫秒),我怀疑它发生是因为内存中的错过。
我使用memset / std:fill来设置默认值。有没有办法确保数组在memset / fill之前驻留在内存中?
答案 0 :(得分:1)
假设这是一个大型内存映射文件,您可以使用带有MADV_WILLNEED
参数的madvise() libc调用来提示您要访问即将提到的区域的操作系统。
然而,YMMV,因为数组需要足够大,以致结果系统调用的好处不会超过拨打电话的成本。
答案 1 :(得分:0)
您可以使用mlock锁定每页粒度的内存,但最多只能达到固定数量(我不确定OS X上的限制是什么,但您可以使用{{1}进行检查与getrlimit
)。
答案 2 :(得分:0)
很可能你有一个多核心处理器,而像memset这样的功能在单核CPU上不使用时实际上会降低性能。互斥锁定可能会导致速度减慢。尝试在堆栈上分配内存而不是动态内存。因为它是一个非常大的数组,所以我会尝试制作我自己的内存管理器并将它的各个部分存储在多个线程中(但这只是我快速阅读文章后的一个想法)。这样做的标准方法是每个线程使用一个内存分配器。在任何情况下,我会研究除了memset之外的其他东西。
也许以下 aticle 会有所帮助