質問: (Hoge)binaryFormatter.Deserialize(memoryStream); } ``` ![GC発生頻度](https://teratail.storage.googleapis.com/uploads/contributed_images/6f6e5cdd17849031580fb2fc6281ccb4.jpeg)
回答: を参照すると、C#のランタイムはJavaと同様世代別GCを行っているように思います。世代別GCでは「生成されたばかりのオブジェクトの多くは生存期間が短く、その中の一部のオブジェクト(GCで使用中であることがわかったもの)は比較的生存期間が長い」という経験則に従います。 上のページで説明されている世代0の領域がいっぱいになるたびにGCが行われますが、通常は比較的生存期間が長いオブジェクトが配置されている世代1,2はGCの対象とせずに、世代0にある「確保されたばかりのオブジェクト」のみに着目してGCするため大量にオブジェクトを生成する期間では世代0の領域のGCが高頻度で行われます。しかしながら上記のアルゴリズムの狙い通り、 (1) 高頻度でGCが行われる世代0のオブジェクトの多くはすぐに開放される (2) 世代1,2はほとんどGCが行われず世代0(一部の領域)のみGCを行うためGCにかかる時間は短い という傾向になるためGCが高頻度で動くことは異常というより「期待されている動き」といってよいと思います。ただ (A) オブジェクトを高頻度で生成するアルゴリズムと生成しなくて済むアルゴリズムの両方が考えられる (B) 高頻度で生成しなくて済むアルゴリズムを取ることで設計が過度に複雑にはならない ならオブジェクトの生成を抑えるアルゴリズムを選択することに一定の効果はあると思います。ただそれにこだわりすぎて平易なアルゴリズムが複雑なアルゴリズムになるくらいなら却ってGCに頼った方が有効(複雑すぎるアルゴリズムはバグの原因・保守性を下げる大きな問題になるかも知れないから)ということになると思います。