C#で図形を扱う(簡易CAM)ソフトを書いています.
最終的なファイル出力時に大量の図形を並び替えたりつなぎ合わせたりして一つのファイルを作るのですが,この時にシリアライズやデシリアライズ,オブジェクトのnewが大量に生じるためかGCの発生頻度がえぐいことになります.
だいたい処理開始からファイル出力完了まで20秒程度の処理なのですが,VisualStudioのGC発生時のマーク?が埋め尽くされます.秒間数回は発生してるのでしょう...
ここで一般論を伺いたいのですが,このように割と時間・負荷のかかる処理でのGCはこんな頻繁に発生してよいものなのでしょうか.
GCが発生しているということは不要な(一時的な)オブジェクトが大量に発生しているということだと思いますが,やはり避けるべきなのでしょうか.
イメージとして
①できるだけ避けたいが,どうしようもないならしょうがない
②何があっても許されない.どうしようもないと思うならプログラムを最初から作り直すべきレベルの大問題
↑このニュアンスだとどちらに近いですか?
stringの結合はStringBuilderを使用し,StringBuilderのインスタンスはループの外で宣言,Clear()で使いまわしをしています.(StringBuilderを用いるとstring型で+演算子を用いるよりもおよそ30%高速化しました)
おそらく,,,シリアライズ・デシリアライズでオブジェクトの複製を作っているのでその時のMemoryStreamが一番の原因かな,とは思っているのですが…
C#
1using (var memoryStream = new System.IO.MemoryStream()) { 2 var binaryFormatter = new BinaryFormatter(); 3 binaryFormatter.Serialize(memoryStream, this); 4 memoryStream.Seek(0, System.IO.SeekOrigin.Begin); 5 NewObj = (Hoge)binaryFormatter.Deserialize(memoryStream); 6}
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/14 13:17