高速化

高速化に関するドットネットマガジンの記事は参考になる。

JIT実行をしないので起動が早くなる。
参考:MSDNの「チュートリアル:カスタム動作を使用して、インストール中にアセンブリをプリコンパイルする」

  • リソースの集約。exeにリソースを埋め込む。
  • コントロールの追加。AddではなくAddRangeを使う。BeginUpdate, EndUpdateを使って描画の一時停止。

SuspendLayoutとResumeLayoutによるコントロール追加時の高速化。また、リサイズ時の高速化にも使える。
Resizeイベントで、SuspendとIdleイベントの登録。IdleイベントでResumeと登録解除。この方法は秀逸。他にも応用可能だろう。

  • GDI+の高速化。DrawImage時には、サイズ指定すると3倍くらい早くなっている。

ラインの描画をFillRectangleに変えると、倍くらい早くなる。
Graphics.SmoothingModeやTextRenderingHintを変えると、数倍早くなる。

  • コントロールのダブルバッファリング。 SetStyle(ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint,true); この方法は前にも書いた。
  • マルチスレッドによる応答性の改善。p64のあたりは一読の価値あり。
  • GCの影響。文字列の連結にStringBuilderを使うことは、常識とすべきだろう。但し、1,2個なら+でつなげる方が早い。数個なら、string.Formatという手もある。また、int i,j;に対し、「,」でつなげた文字列は、i+","+jで作れるが、 i.ToString()+","+j.ToString()の方が早い。とは言っても、通常は簡潔に書くべきで、どうしても速度が気になる部分だけ直すべきだろう。
  • WeakRefernceによるキャッシュ。大量の生成と廃棄時などに有効。
  • 例外処理。これは、VB.NETのOnErrorの話。