我在C#中要求一個項目,但我認爲這個問題也適用於其他語言。我聽說大規模的對象創建和銷燬會導致大量的開銷和性能問題。我想知道是否可以通過簡單地使用結構而不是對象來解決這個問題。對象創建開銷是否適用於結構?
0
A
回答
2
下面是一些事實,你現在必須對struct
和C#class
:
- 在C#中
struct
是更快地創建比class
因爲它是在棧中分配,而不是堆 struct
是一個值類型,class
是一個引用類型。因此,使用引用類型(將其作爲參數傳遞,複製它)比使用值類型要快得多。看到因爲他們堆棧
這裏就分配Difference between struct and class
struct
領域是快比class
領域的訪問是對GC是如何工作的一些事實。Net:
- 您無法控制GC何時由CLR觸發,它可以隨時中斷您的程序(您可以使用一些選項告訴CLR您正在運行的是如果需要內存,它不會阻止GC運行。請參閱GC Latency Modes)
- 您無法控制GC執行工作的時間
- 當GC做一個完整的收集,它凍結所有的程序線程(取決於你是否在gcConcurrent或gcServer模式下見gcServer mode)。
要知道所有這些,並且要簡短,如果您不希望程序受到GC工作的影響,則必須使用引用類型來存放程序中較長的對象,並使用值用於非常短時間且處於非常局部範圍的對象的類型。
5
「製作結構,而不是對象」 - 你來看,它(我想你通過對象的意思是類)將最有可能幫助不大,因爲創建結構實例中,由於結構的性質,將需要你的價值,而不是通過引用來引用它 - 這可能(不總是)使你的內存使用較重
話雖這麼說,你可能需要的是Flyweight設計模式
從https://sourcemaking.com/design_patterns/flyweight:
Flyweight設計模式
意向
使用共享,以有效支持細粒度對象的大量涌現。
Motif GUI採用輕量級小工具替換重磅小工具的策略。
問題
設計對象下降到系統「粒度」的最低水平提供最佳的靈活性,但可以是在性能和存儲器使用方面不可接受的昂貴。
討論
的享元模式介紹如何共享對象,以允許其在精細粒度不太高的成本使用。每個「輕量級」對象分爲兩部分:狀態依賴(外部)部分和狀態無關(內部)部分。內部狀態在Flyweight對象中存儲(共享)。外部狀態由客戶端對象存儲或計算,並在調用其操作時傳遞給Flyweight。
相關問題
- 1. 選項是否適用於結構?
- 2. 結構和對象創建
- 3. Javascript創建對象結構
- 4. 創建適用於一個String對象
- 5. 數據庫結構:此結構是否適用於m:m?
- 6. Zookeeper是否適用於對象緩存?
- 7. 字面對象語法是否僅適用於OS X開發?
- 8. 創建對象的方法只適用於單例對象嗎?
- 9. 首先創建表結構或對象
- 10. 在C#中銷燬結構對象?
- 11. 開銷:方法調用與創建對象
- 12. 基於結果集創建對象
- 13. 如何構建用於層次結構目的的Json對象
- 14. 複製elision是否適用於結構化綁定
- 15. memcpy是否適用於結構中的大型數組?
- 16. 從對象列表中遞歸創建對象樹結構
- 17. 是否在每個請求上創建並銷燬應用程序對象?
- 18. Equals不適用於結構?
- 19. 對象屬性的更改值不適用於使用NSKeyedUnarchiver創建的對象
- 20. 使用JavaScriptSerializer創建自我構建對象(等同於JSON.PARSE)
- 21. django orm是否立即創建對象
- 22. 是否在Python中創建類「對象」
- 23. 適用於全球班級的適當面向對象的結構
- 24. MaxCPUCount參數是否適用於MSBUILD來構建Delphi項目?
- 25. Microsoft WebDriver是否適用於Windows Insider構建?
- 26. 用於創建開發環境文件夾結構的腳本?
- 27. 框架功能不適用於我創建的框架對象
- 28. 是否將對象標記爲可串行化發生開銷?
- 29. 域模型對象是否在層之間傳遞開銷?
- 30. Java Integer和Double對象是否有不必要的開銷?
對象創建的確會產生一些實際成本 - 你在招募垃圾收集器;雖然gen 0非常高效,但如果這是您打算傳遞的數據的總和,它仍不如傳遞一個簡單的整數。一般來說,如果數據量非常小(幾個字節),那麼結構更好(幾乎總是假設你使它們不可變)。有時甚至更大,如果GC開銷使它值得。 –
如果你想知道一個特定的編程技術的成本,然後**使用科學**,而不是互聯網上的陌生人的意見。你知道你有一個性能問題嗎?如果你不知道*然後*爲什麼你想解決一個你可能甚至沒有的問題*,使用可能不起作用的技術? –