構造体かクラスか
16バイト以下のデータであれば、構造体の方が高速。
- http://msdn.microsoft.com/ja-jp/library/ms229017.aspx
- http://mag.autumn.org/Content.modf?id=20061014194823
キャストか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 のための処理が必要となる。