2011-11-25 168 views
6

我對此我無法在網絡上找到答案的問題...爲什麼釋放速度很慢?

我已經宣佈了一組這樣的:

set<unsigned int> MySet 

我將與梅森倍捻機產生一百萬個隨機數。隨機生成和插入速度非常快(一百萬個數字大約爲一秒),但釋放非常緩慢(1分半鐘)。

爲什麼釋放這麼慢?我沒有使用任何自定義析構函數。

+0

我不知道你用的是什麼作品Sys系統,但它可能是內存是每個塊被釋放後,被重新壓縮。 –

+2

您是否在開啓優化的情況下進行編譯? -O3 –

+0

Windows 7x64。在Visual Studio 2010下編譯。 有什麼方法可以加速釋放嗎? –

回答

7

編譯在釋放模式代碼。

這做了兩兩件事。

  1. 原來的優化,這肯定有幫助。
  2. 此外內存管理庫對於調試和發佈也不同。
    庫的調試版本在建造時,允許進行調試和維護這些額外的信息(如標記去分配的內存)。所有這些額外的處理並實際成本
    • 兩個版本庫的目的是完全不同的。發佈版本絕對針對速度進行了優化,調試版本針對恢復和調試進行了優化。

注意此信息是關於DevStudio的。

1

大概是因爲它更有意義的重新分配爲代價的優化配置,因爲許多應用程序分配不解除分配,但從來沒有反之亦然。我已經看到了類似的模式自己,在混合mallocfree電話(而不是分配和釋放所有在一次)的應用程序。

我從來沒有寫過堆分配,所以我不知道是否有更深層次的技術原因不止於此。釋放時,必須找到併合並相鄰的空閒塊。所以這項工作只是根本不同。

1萬的小 free()

90秒聽起來很慢。我從來沒有真正編寫過Windows,所以我不能說這是不正常的,但系統應該能夠做得更好。

你的問題的解決方案可能是簡單地跳過程序退出前釋放的對象。您可以嘗試從std::allocator< unsigned int >中派生出一個自定義分配器,這使得deallocate無法運行。