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