簡體   English   中英

硬件如何影響Windows上malloc \\ new的性能

[英]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;
}
  1. 在解析過程中創建了上萬個這樣的結構
  2. 緩沖區不是很大,1字節到幾百個字節

分析器報告說,最昂貴的功能是

  1. 免費(13000個獨家樣本,38%獨家樣本)
  2. 新的操作員(13 000個獨家樣本,38%獨家樣本)
  3. 重新分配(4000個獨家樣本,13%獨家樣本)

我設法優化並減少了分配給

  1. 新的操作員(2200個獨家樣本,48%獨家樣本)
  2. 免費(1770個獨家樣本,38%獨家樣本)
  3. 某些功能(73個獨家樣本,1.5%獨家樣本)

當我測量客戶端等待時間(即客戶端等待秒表處理動作)時,我機器上的安裝版本 從85s的處理時間變為16s的處理時間 ,這很棒。 我繼續在我們擁有的功能最強大的計算機上進行測試,並驚訝地發現,非優化版本僅用了3.5s而優化后大約是2s 相同的可執行文件,相同的操作系統...

問題:如何在兩台現代機器上實現這種差異?

規格如下:85s至16s機器

在此處輸入圖片說明

3.5s至2s機器

在此處輸入圖片說明

處理是單線程的。

正如其他人所評論的那樣,頻繁的小分配浪費了時間和內存。

對於每個分配,都有開銷:

  • 函數調用准備
  • 函數調用(執行路徑中斷;可能重新加載執行管道)。
  • 查找內存塊的算法(也許正在搜索)。
  • 分配內存(將塊標記為不可用)。
  • 將地址放入寄存器
  • 從函數返回(順序執行中的另一個中斷)。

無論您的計算機速度如何,上述過程都是執行很多操作以分配一小塊內存。

現代處理器喜歡保持數據緊密(如在數據緩存中)。 當他們可以從緩存中獲取數據而不在處理器外部獲取數據時,它們的性能會提高(訪問時間越慢,值越遠,例如片上內存,外部內核;同一板上的片外內存;其他板上的內存) ;設備(例如Flash和硬盤驅動器)上的內存重新分配內存會降低數據緩存的效率。

操作系統可能會參與其中並減慢您的程序速度。 在分配或刪除功能中,OS可以檢查分頁 以簡單的形式進行分頁是將內存區域與硬盤驅動器上的區域交換。 當其他更高優先級的任務正在運行並且需要更多內存時,可能會發生這種情況。

一種加速數據訪問的算法:

  1. 從內存中將數據加載到局部變量中(如果可能,則進行注冊)。
  2. 處理局部變量(寄存器)中的數據。
  3. 存儲完成的數據。

如果可以,請將數據放入結構中。 一次加載所有結構成員。 結構允許將數據放置到連續內存中(這減少了重新加載緩存的需求)。

最后,減少分支或執行更改。 研究“循環展開”。 您的編譯器可能會在更高的優化設置下執行此優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM