C# パフォーマンスコーディング Tips

以下のTipsはC#プログラミング上パフォーマンス重視の場合覚えておいたほうが良いかもしれません。

1、try{ } catch { }ブロックでfinally句を使って、リソースの割り当て解除を確保する。
2、可能であればスレッドを共有リソースとして利用し、最適化した.NETスレッドプールを使用する。
3、サーバベースマルチCPU環境では、サーバガベージコレクターを使用する。
4、文字列を連結する場合、「+=」を使用しない。
5、using(obj)を使って、コーディングを簡潔化する。
    using(obj)はtry{}finally{obj.Dispose(); }の同義語であり、使用後objの消滅を保証する。
6、スレッドを使う場合、スレッドプールを使用する。

WaitCallback methTarget = new WaitCallback(myClass.Method);

ThreadPool.QueueUserWorkItem(methTarget);

7、文字列の連結はStringBuilderを使用すること。「+」は使用しない。
8、コレクションのマルチスレッドを扱う場合、コレクションスレッドセーフを保証しなければならない。

ArrayList myAr = new ArrayList();

// Creates a synchronized wrapper around the ArrayList.

ArrayList mySyncedAr = ArrayList.Synchronized(myAr);

// To use collection from thread:

ArrayList myCollection = new ArrayList();

lock(myCollection.SyncRoot);

foreach ( Object item in myCollection )

{ // do work here }
 
下記のMSDNの説明を銘記してください:
「ArrayList を確実にスレッド セーフにするためには、すべての操作を Synchronized メソッドから返されるラッパー経由で実行する必要があります。

コレクションの列挙処理は、本質的にはスレッドセーフな処理ではありません。
コレクションが同期されている場合でも、他のスレッドがそのコレクションを変更する可能性はあり、
そのような状況が発生すると列挙子は例外をスローします。
列挙処理を確実にスレッドセーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチします。」

9、ノード生成を加速するために、コレクションサイズの初期化は開始時に行うべき。