[英]How does hardware affect the performance of malloc\new on Windows
我正在研究Windows 7上c ++應用程序的性能,該應用程序正在執行大量計算和大量小的分配。 基本上,我使用Visual Studio采樣探查器觀察到了瓶頸,最終歸結為文件的解析和創建這種類型的巨大樹結構的瓶頸。
class TreeStruct : std::map<key, TreeStructPtr>
{
SomeMetadata p;
int* buff;
int buffsize;
}
分析器報告說,最昂貴的功能是
我設法優化並減少了分配給
當我測量客戶端等待時間(即客戶端等待秒表處理動作)時,我機器上的安裝版本 從85s的處理時間變為16s的處理時間 ,這很棒。 我繼續在我們擁有的功能最強大的計算機上進行測試,並驚訝地發現,非優化版本僅用了3.5s
而優化后大約是2s
。 相同的可執行文件,相同的操作系統...
規格如下:85s至16s機器
3.5s至2s機器
處理是單線程的。
正如其他人所評論的那樣,頻繁的小分配浪費了時間和內存。
對於每個分配,都有開銷:
無論您的計算機速度如何,上述過程都是執行很多操作以分配一小塊內存。
現代處理器喜歡保持數據緊密(如在數據緩存中)。 當他們可以從緩存中獲取數據而不在處理器外部獲取數據時,它們的性能會提高(訪問時間越慢,值越遠,例如片上內存,外部內核;同一板上的片外內存;其他板上的內存) ;設備(例如Flash和硬盤驅動器)上的內存重新分配內存會降低數據緩存的效率。
操作系統可能會參與其中並減慢您的程序速度。 在分配或刪除功能中,OS可以檢查分頁 。 以簡單的形式進行分頁是將內存區域與硬盤驅動器上的區域交換。 當其他更高優先級的任務正在運行並且需要更多內存時,可能會發生這種情況。
一種加速數據訪問的算法:
如果可以,請將數據放入結構中。 一次加載所有結構成員。 結構允許將數據放置到連續內存中(這減少了重新加載緩存的需求)。
最后,減少分支或執行更改。 研究“循環展開”。 您的編譯器可能會在更高的優化設置下執行此優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.