高効率C#符号化最適化の原則

3980 ワード

本稿では,効率的なC#符号化によく見られる最適化の原則をまとめ,C#プログラム設計を行う上で大きな参考となる.具体的には、次のようになります.
1.foreach VS for文
Foreachはforよりも実行効率が良いForeachの平均時間はforの30%しかかかりません.テスト結果でforとforeachが両方使える場合は、より効率的なforeachをお勧めします
また、forでデータを書き込む時間は、データを読み取る時間の約10倍程度である.
2.ArrayListの使用を避ける
ArrayListの性能が低い任意のオブジェクトをArrayListに追加するにはSystemとして封入する.Objectは、ArrayListからデータを取り出しても実際のタイプの汎用集合クラスに戻す高性能であり、汎用集合は強いタイプである
3.HashTable辞書セットの使用
StringDictionary,NameValueCollection,HybridCollectionのような辞書セットの代わりに、少量のデータを格納する場合はHashTableを使用することを推奨します.
4.文字列コンテナに定数を宣言する
文字列コンテナに定数を宣言するには、文字列を二重引用符」に直接カプセル化しないでください.文字列オブジェクトがメモリに作成され、解放されないようにします.文字列オブジェクトへのアクセス効率を向上する.

// 
MyObject obj = new MyObject();
obj.Status = “Active”;
// 
const string c = “Acive”;
MyObject obj = new MyObject();
obj.Status = c;

5.Stringを使用する.Compare()文字列比較
UpperCaseやLowerCaseを使用する文字列の大文字と小文字を変換しないで、比較してStringを使用します.Compare()は文字列の大文字と小文字を無視して比較できます

String strTemp = “Active”;
If(String.Compare(strTemp,”active”,true)==0){
     Consolt.Write(“Equal”);
}

6.StringBuilder文字列による接続
①.Stringクラスのオブジェクトは可変(読み取り専用)である、Stringオブジェクトの再割り当ての本質は、新しいStringオブジェクトを再作成し、そのオブジェクトに新しい値を与えることである.
②.System.Text.StringBuilderは長さがCapacityに等しい文字列(文字配列と見なすことができる)を維持し、Capacityの長さの文字列が結果文字列を収容するのに不足している場合、StringBuilderは上記の規則によって計算されたCapacityのメモリ領域として新しい長さを開き、元の文字列を新しいメモリ領域にコピーして操作し、元の文字列領域をGCに渡して回収する.そこでここではメモリの割り当てや回収にも関わるので、StringBuilderを使う場合は必要容量を見積もって、この容量でCapacityを初期化し、性能を向上させるのがベストです.StringBuilderは、すべてのインスタンスメンバーがスレッドセキュリティであることを保証することはできません.タイプ定義には多くのスレッドセキュリティの制御が組み込まれていますが、スレッドセキュリティを確保するには、スレッド同期メカニズムを手動で実現する必要があります.
7.XPathDocument XMLファイルを読み込む
XMLオブジェクトのデータを読み込むだけなら、XMLDocumentの代わりに読み取り専用のXPathDocumentを使うとパフォーマンスが向上します
8.循環体で変数を宣言しないで、循環体外で変数を宣言し、循環体内で変数を初期化する.

// 
For(int i=0;i<10;i++){
    SomeClass obj = new SomeClass();
    //…
}
// 
SomeClass obj = null;
For(int i=0; i<10; i++){
    obj = new SomeClass();
    //…
}


9.指定された例外の取得
異常を捕捉場合は、特定の異常クラスを用いる捕捉し、異常が捕捉範囲に従って共通のSystemを使用しないように小さい順に定義する.Exception

Private void Find(object obj){
    try{
        Console.write(obj.ToString());
      }
    catch(ArgumentNullException ane)
      {  //…  }
    catch(ArgumentException ae)
      {  //…  }
    catch(SystemException se)
      {  //…   }
    catch(Exception e)
      {  //…   }
}

 
Exception制御フローを使用することなく、異常な性能損失をキャプチャすることは周知である.そのため、異常の発生を避けることが望ましい
10.usingとtry/finallyを使用してリソースをクリーンアップする
.NETプラットフォームはメモリ管理の面でGC(Garbage Collection)を提供し、管理リソースとメモリ回収の自動解放を担当しているが、非管理リソースを解放することはできない.この場合、オブジェクト内に割り当てられた非管理リソースを解放するために、自分で方法を提供しなければならない非管理リソースのタイプを使用するには、IDisposableインタフェースのDisposeメソッドを実現しなければならない.正確な資料を解放するには、Disposeメソッド付きのタイプ化リソースを使用する場合、使用終了時にDisposeメソッドを呼び出し、不要なリソースを速やかに解放しなければならない.USingまたはtry/finallyを使用すると、Disposeメソッドがタイムリーに呼び出されることをよりよく保証できます.
11.乱用反射を避ける
反射は性能を浪費する操作であり、反射を乱用して性能に影響を与える原因を避けるべきである:反射を使用してタイプやトリガ方法を呼び出し、フィールド属性にアクセスする場合、CLRはより多くの仕事をする必要がある:パラメータの検証、権限の検査など.動的構造タイプ(遅いバインド)のアプリケーションを記述する場合、クラスの継承関係を介してインタフェースを介して委任によって実装される代わりに、以下の方法で実装することができる.
12.梱包作業を避ける
値タイプのToStringメソッドを使用する箱詰め操作の原因を回避する:数字と文字列がつなぎ合わせる場合、データタイプが異なるため、数字は箱詰め操作によって参照タイプに変換されてから文字列とつなぎ合わせることができる.

// 
int num=5;
string str = “link me”+num.ToString();

13.HttpServerUtility.Transfer
サーバを使用Transfer構文では、ページ内でこの方法を使用すると、不要なクライアントリダイレクト(Response.Redirect)を回避できます.
Int32.TryParse()タイプ変換Int 32.TryParse()はInt 32より優れている.Parse()はConvert.より優れている.ToInt32()
Convert.ToInt 32は最終的な解析作業代理店をInt 32に渡す.Parse
Int32.Parseは最終的な解析ワークエージェントをNumberに渡します.ParseInt32
Int32.TryParseは最終的な解析ワークエージェントをNumberに渡します.TryParseInt32
本稿で述べたC#最適化の原則は皆さんのC#プログラム設計に一定の参考になると信じています.