2011-08-02 84 views
2

我寫了需要大約1GB的RAM歸零啓動時的程序,這是花更多的時間比計劃從冷啓動合併的其餘部分。 (這是一個簡單的程序,後續運行幾乎不需要分配任何時間)。當通過任務管理器觀看時,它幾乎沒有RAM開始,然後增長大約2MB /秒,直到它達到它需要的1GB。我發現了選項「堆預留大小」和「堆提交大小」,並將它們設置爲每個1000000000,但是當我通過任務管理器觀看該程序時,程序看起來從1GB開始,然後以2MB /秒的速度增長直到我得到一個bad_alloc。有問題的行是: std::vector<std::vector<char> > data(512, std::vector<byte>(2097252, 0));
有人能清楚地解釋這些選項是,如果有使用它們,以加快我分配的方法嗎?我已閱讀http://msdn.microsoft.com/en-us/library/f90ybzkh(v=vs.80).aspx,但它不能解釋我觀察到的行爲。MSVC堆保留/提交

+1

錯誤堆,這是進程堆,而不是CRT堆。聽起來你的頁面文件有麻煩,在舊的XP機器上很常見。查看SysInternals的PageDefrag實用程序。 –

+0

我不能回答我自己的問題七個小時,但我意識到這可能是因爲第一次運行必須將內存頁面內容分頁到硬盤驅動器,而後續運行有第一次運行後留下的所有未使用的RAM 。分配/調零與它無關。對不起所有。 –

回答

1

我意識到這可能是因爲第一次運行有網頁的東西了內存到硬盤驅動器,而隨後的運行已在第一次運行後留下的所有未使用的RAM。分配/調零與它無關。對不起所有。

3

你的內存分配不會導致你的速度問題。你的速度問題是由512MB零拷貝引起的。改變這些屬性不會幫助你。

我會調查歸零內存,而不是依靠std::vector這樣做對你的有效途徑。或者,至少不要將2MB數據的std :: vector作爲參數傳遞給構造函數。讓默認構造函數創建512個空向量,然後將它們中的每一個調整爲2MB。至少那不會是內存拷貝;只是一堆內存寫入。

+0

我會研究更有效的方法來按照你的說法來零記憶,但由於在隨後的運行中該操作幾乎是即時的,因此對於我來說這似乎是個問題。我會盡量記得在我回家的時候。 –

+0

感謝您指出分配可能不是阻塞點。你讓我在正確的軌道上找出答案。 –