2011-07-07 67 views
3

我需要为一个非常大的数组中的所有entires设置一些默认值。 这需要我很长的时间(110-120毫秒),我怀疑这是因为记忆中的失误而发生的。有没有办法确保一个数组变量(unsigned int *)将在内存中?

我使用memset/std:fill来设置默认值。有没有办法确保数组在memset/fill之前驻留在内存中?

+3

你是什么意思'记忆中'?居民?映射到页面表中?在缓存中?在L1? – bdonlan

+0

另外,您定位的操作系统是什么? – bdonlan

+0

“内存中的错失”,你的意思是页面错误? – hammar

回答

1

假设这是一个大型的内存映射文件,您可以使用带有MADV_WILLNEED参数的madvise() libc调用来向操作系统提示您希望访问即将提到的区域。

但是YMMV,因为数组需要足够大以致于所产生的系统调用的好处不会超过拨打电话的成本。

0

您可以使用mlock每页granuality锁定内存,但最多只能以固定的金额(我不知道极限是在OS X上的东西,但你可以使用getrlimitRLIMIT_MEMLOCK检查)。

0

很可能你有多核心处理器,而memset等功能在不用于单核CPU时性能会降低。互斥锁可能导致放缓。尝试在堆栈上分配内存而不是动态内存。由于它是一个非常大的数组,因此我会尝试制作自己的内存管理器,并将其分段存储在多个线程中(但这仅仅是我阅读快速文章后的一个想法)。一个标准的做法是每个线程使用一个内存分配器。无论如何,我会研究memset以外的东西。

也许以下 aticle将帮助

+0

在任何现代操作系统上(当然也包括操作系统X按照OP),写入堆栈没有什么特别之处堆 - 这只是(虚拟)内存中的页面 - 所以在堆栈内存v.s上调用memset()的速度没有任何区别。堆内存。 – DaveR

+0

另请注意,在OS X的通用[memset](http://www.opensource.apple.com/source/Libc/Libc-594.9.5/string/memset-fbsd.c)例程中或在[x86-64](http://www.opensource.apple.com/source/Libc/Libc-594.9.5/x86_64/string/memset.s)之一。 – DaveR

+0

@Dave即使线程是自治的,也只有一个内存分配器会在它们之间产生冲突。 –

相关问题