2016-04-21 56 views
0

我在C#中要求一個項目,但我認爲這個問題也適用於其他語言。我聽說大規模的對象創建和銷燬會導致大量的開銷和性能問題。我想知道是否可以通過簡單地使用結構而不是對象來解決這個問題。對象創建開銷是否適用於結構?

+1

對象創建的確會產生一些實際成本 - 你在招募垃圾收集器;雖然gen 0非常高效,但如果這是您打算傳遞的數據的總和,它仍不如傳遞一個簡單的整數。一般來說,如果數據量非常小(幾個字節),那麼結構更好(幾乎總是假設你使它們不可變)。有時甚至更大,如果GC開銷使它值得。 –

+3

如果你想知道一個特定的編程技術的成本,然後**使用科學**,而不是互聯網上的陌生人的意見。你知道你有一個性能問題嗎?如果你不知道*然後*爲什麼你想解決一個你可能甚至沒有的問題*,使用可能不起作用的技術? –

回答

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。

    相關問題