Re: [問題] 同時間需要大量delete的狀況

看板C_and_CPP作者 (天亮damody)時間11年前 (2013/07/05 06:17), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串3/4 (看更多)
※ 引述《xtxml (赤木巧☠)》之銘言: : 最近碰到一個問題,想問問板上先進的如何處理比較合適。 : 簡述問題的狀況如下: : 有一個功能會依照輸入值,動態產生node, : 有時可能只有千百個,有時候會上萬甚至幾十萬。 : 這些node數量過大的時候,delete階段相當緩慢,有時一停就是2~3秒。 : 而這些node保證一定是一起新增,一起刪除, : 中間不會有node提前刪除或者刪除了又新增的行為。 : 並且不太在乎記憶體的使用,但很在乎速度。 : 目前兩個方式: : 1.之前的做法會是,寫一個manager來把這些資料收集起來,延遲刪除。 : 2.而我想自製一個memory allocator類別,給裝node的容器使用,他的行為是: : (1)批量的向系統要記憶體,一次可能要100或1000個node的大小, : 然後慢慢分配給容器使用,用完再要一個批量。 : (2)容器要求deallocate的時候不做事,只確保做完解構。 : (因為記憶體不重複使用,最後會一次刪,所以不一一處理deallocate) : (3)等全部的node要一起刪除的時候,把批次要來的記憶體釋放掉, : 可以大量減少delete的次數。 : 想請教一下: : 一.這樣的問題有沒有其他更合適的處理方式?方法1.或方法2.哪一個好一點。 : 二.關於方法2.目前想到就是要謹慎使用,並且包裝好確保會安全的刪除, : 不知道有沒有什麼我沒有考慮到的缺點,或者不推薦這樣做的理由。 : 還請各位指教,感謝。 不建議用 boost.pool 以前在寫射擊小遊戲時給我很不好的印象 我是用在子彈大量的 new 跟 delete 的時候, 大約每秒 new 4~6萬 delete 4~6萬, 發現 boost.pool 會有週期期的 lag。 可以用 http://www.codeproject.com/Articles/2735/ VMemPool-Virtual-Memory-Pool-Management-class 這個比較順。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.88.25

07/05 14:41, , 1F
我想請教一下,為什麼在同一秒 new/del 大小是近似的?
07/05 14:41, 1F

07/05 14:42, , 2F
若是 new 6萬 / delete 4萬, 相對的只需要做 new 2萬就行?
07/05 14:42, 2F

07/05 14:59, , 3F
07/05 14:59, 3F
這文章沒有考慮到實際的應用, 第一個測試是 new 完直接 delete 第二個是 全部 new 完一起 delete 但實用上最常見的是, 一邊 new 一邊 delete new 跟 delete 的速度還不一定會一樣 這時 boost 明顯的就會像 這個測試裡面的 第二個 效能差的例子一樣,超慢的, 因為他沒辨法整個一起 delete 只能一個一個慢慢 delete GG

07/05 17:09, , 4F
可是實際上重載 new 跟 delete 比較方便
07/05 17:09, 4F
※ 編輯: damody 來自: 114.37.88.25 (07/05 17:18)
文章代碼(AID): #1HrVHhiR (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1HrVHhiR (C_and_CPP)