2011-07-07 68 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即使線程是自治的,也只有一個內存分配器會在它們之間產生衝突。 –

相關問題