我正在使用C++編寫的大型服務器應用程序。此服務器需要運行幾個月而不重新啓動。因爲我們的內存消耗會隨着時間的推移而增加,所以碎片已經成爲一個可疑的問題到目前爲止,測量是將專用字節與虛擬字節進行比較,並分析這兩個數字之間的差異。在編碼時考慮內存碎片:過早優化與否?
我的碎片分析的一般方法是將其留給分析。我有同樣的方式來思考其他方面,比如一般性能和內存優化。您必須通過分析和證明來備份更改。
在代碼審查或討論期間,我注意到很多內存碎片是出現的第一件事情之一。這幾乎就像現在有一個巨大的恐懼,並且有一個很大的舉措來提前「防止碎片化」。要求更改代碼似乎有利於減少或防止內存碎片問題。我傾向於不同意這些蝙蝠,因爲它們看起來對我來說是過早的優化。我會犧牲代碼清潔/可讀性/可維護性等。以滿足這些變化。
例如,採取以下代碼:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
上面,字符串流使得這裏是不確定的分配的數量,也可能是4次分配,或僅有1分配。所以我們不能單獨進行優化,但一般的共識是要麼使用固定的緩衝區,要麼修改代碼以使用更少的分配。我真的沒有看到stringstream在這裏作爲一個巨大的內存問題貢獻者,但也許我錯了。上述
一般改進建議代碼是沿着線:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
還有一個巨大的推動,其中以往任何時候都可以使用堆棧上堆。
是否有可能以這種方式搶佔內存碎片,或者這只是一種虛假的安全感?
我想一個簡單的判斷方法是:你擔心程序中的兩件事:實現正確性和實現效率。我們都希望兩個類別中的最高水平,但實際上最好把重點放在正確性而不是效率上,因爲世界上最有效的錯誤程序仍然是錯誤的,仍然是無用的。你應該把精力集中在你的能力上; *過早優化只是意味着更多地關注效率而不是正確性*。如果您有能力在不犧牲正確性的情況下提高效率,您絕對應該這樣做! – GManNickG
'在這裏,碎片已經是一個可疑的問題,因爲我們的內存消耗會隨着時間的推移而增加。「在我看來,簡單的舊內存泄漏將是一個更可能的懷疑 - 可能希望首先排除這些內存泄漏(並使用像valgrind或drmemory它也比檢查你的整個代碼庫的碎片來源更容易) – smocking