CSharp言語 パフォーマンス

Last-modified: 2011-02-07 (月) 14:09:10

構造体かクラスか

16バイト以下のデータであれば、構造体の方が高速。

キャストかas演算子か

キャストの場合、InvalidCastException例外を投入するためのコードが挿入されるため、低速。

ジェネリックか、objectか

色んな型を入れるためのコンテナを作った際に、ジェネリックとするか、スーパークラスであるobjectにしておくか。
objectの場合、キャストまたはas演算子が必須となる。キャストよりas演算子の方が高速ではあるが、それよりも型変換が不要なように作ったほうが遥かに高速。
そんなわけで、ジェネリックコンテナ推奨。

System.Drawing.ImageのGetPixel(),SetPixel()は使うな。

重すぎる。代わりにLockBits()/UnlockBits()でbyte[]単位で処理せよ。byte[]であれば、マルチスレッドアクセスも可能だ。

System.Windows.Forms.ListBoxは、BeginInit()/EndInit()しろ。

さもないと描画更新が入りすぎて重い。

頻繁に繰り返す処理で、リフレクションを使うな。

どうしても使いたい場合は、Dictionary<TKey,TValue> で型情報をキャッシュしろ。

foreach をなるべく使え。

微妙な差であることが多いけど、forで回したり、MoveNext()すると、IndexOutOfRangeException例外投入のためのコードが入って、重くなる。

Threadよりも、BackgroundWorker。BackgroundWorkerよりもThreadPoolを使うべし。

スレッドを使用する場合、固定的なスレッドを立てるThreadよりも、コア数に応じて適切なスレッドを起こしてくれるThreadPoolを用いるべし。
ただし、ThreadPoolは、起こすスレッドに限りがあるので、特定のスレッドを長時間占有するようなタスクには向かない。そのようなタスクをQueueUserWorkerItemで突っ込むと、他のタスクが起動できなくなる恐れがある。

eventをnull初期化しても無駄。

Releaseビルドすれば消える。

Sleep()よりもAutoResetEvent/ManualResetEvent

Sleep()して、他のスレッドと同期をとるより、AutoResetEvent.WaitOne()などを使用した方が良い。
Sleep()は、往々にして指定した時間よりも、よく寝てしまうし、寝なくていいときでも寝てしまい、最高のパフォーマンスを得にくい。

new EventArgs() するな。

EventArgs.Emptyフィールドを使え。new するたびにメモリを消費するし、new のための処理が必要となる。