C#のパフォーマンスの最適化の詳細

1、操作を開梱、一般的な梱包の使用を避けるために。

        GCパッキング操作は圧力の原因となります。一般的なコレクションを回避するために使用されるべきコレクションに発生した場合。
        値の収集のために、<TKEY、TValue>辞書を使用して代わりのArrayListの一覧<T>の代わりにハッシュテーブルを使用しました。

ArrayList h=new ArrayList();  //不建议
h.Add(1);
List<object> h = new List<object>();  //不建议
h.Add(1);
List<int> h = new List<int>();    //建议
h.Add(1);
2、初期値に割り当てられた空の文字列String.Emptyの変数を使用して

        String.Emptyを一の指示対象で、「」具体的な実現であります

string filter=“”;//不建议
stringfilter=string.Empty; //建议
3、StringBuilderの文字列スプライシング操作

       スプライスは、文字列のスプライシング操作を行うために使用されなければならない上、特に10倍(経験値)の長い文字列を構築するためのStringBuilder

//不建议:
string s = null;
for (int i = 0; i < 10000; i++)
{
s += i;
}
//建议:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}
string t = sb.ToString();
4、の初期サイズを指定のStringBuilderを作成する
        デフォルトの初期サイズは、かつて複数回、16で、必要リサイズGCの圧力を増加します。勧告は、初期サイズは、経験に基づいて指定します。

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append(i);
}
string s = sb.ToString();
//建议修改为
StringBuilder sb = new StringBuilder(256);
for (int i = 0; i < 10; i++)
{
sb.Append(i);
}
string s = sb.ToString();
5、虐待のStringBuilderのを避けるために(注意、私は使用していません)

        同様に0009 + STR2 + STR3 + STR4ストリングスプライシング動作String.Concat(STR1、STR2、STR3、STR4)としてコンパイルされますが、効率のStringBuilderよりも高くなります。String.Concat文字列の長さは、一度決定され、StringBuilderの文字列を生成した複数のオブジェクトの場合にも適用、リサイズ実行する必要があります。

        直接によって.LENGTH = 0は、StringBuilderの初期化されます。

        結果によると、場合.LENGTH = 0によって直接提供同じStringBuilderオブジェクトを使用して複数回のは、最も速い初期化します。

StringBuiler sb = new StringBuilder(256);
......
sb.Remove(0, sb.Length); //不建议
sb.Length = 0; //建议
図6に示すように、パラメータとして複合型変数の値は、効率基準改善するために使用することができる
        管理ヒープ参照型から割り当てられたコールスタックの割り当てからの値型を。方法は、値型のパラメータとして使用される場合、デフォルトパラメータ値がコピーされます。

//不建议
static void PrintDateTime(DateTime dt)
{
Console.WriteLine(dt);
}
//建议
static void PrintDateTime(ref DateTime dt)
{
Console.WriteLine(dt);
}
7、ItemArrayはDataRowを一括割り当てを達成使用して

       ときにすべてのフィールドのDataRow割り当て、効率が低いことによって、列の割り当てにフィールド名を使用します。この時点で、我々はバルクフィールドの割り当てを使用するようにしてください。

       あなたはItemArrayまたはrows.Addメソッドを使用することができます。

// ds是数据集(DataSet)对象
DataTable dt = ds.Tables[0];
DataRow row = dt.NewRow();
row.ItemArray = new object[] { value1, value2, …, valuen };
// ds是数据集(DataSet)对象
DataTable dt = ds.Tables[0];
dt.Rows.Add(value1, value2, …, valuen);

       次のように、連続した単一代入の多くを行うことを避ける必要があります。

DataTable dt = ds.Tables[0];
DataRow row = dt.NewRow();
row["col1"] = value1;
row["col2"] = value2;
…
row["coln"] = valuen;
図8に示すように、並列計算データテーブルの使用の合理化

       データテーブル内蔵並列計算は、効率を最適化するために、各CPUのための機能をコンピュータを利用することができます。

IEnumerable<DataRow> FindRows() //查找所有数量小于0的分录
{
    DataTable dt = ItemDataTable;
    ……
    return dt.Select(“Quantity<0”); //未使用并行计算
}
IEnumerable<DataRow> FindRows() //查找所有数量小于0的分录
{
    DataTable dt = ItemDataTable;
    ……
    int index = dt.Columns.IndexOf("Quantity");
    return dt.AsEnumerable().AsParallel().Where(dr => (decimal)dr[index] < 0); //使用并行计算:
}

        実験によれば、場合並列計算データテーブルを選択し、優れた濾過及び循環モードの行選択;場合も同様の性質の行。

9、ImportRowを達成するための合併は、同じ構造のデータテーブルを使用します

       Mergeメソッドを簡単に統合のDataTableを達成することができます使用しますが、非常に効率が悪いが、コードをマージしています。例としては、次のとおりです:
DataTable[] srcTables= ... ;
foreach(DataTable src in srcTables)
{
	dest.Merge( src ) ;
}
       ImportRowも性能がはるかに高いマージするために比較され、データテーブルマージ・オペレーションを実現することができます。次のようにコード例は以下のとおりです。
DataTable[] srcTables = ... ;
foreach(DataTable src in srcTables )
{
  foreach(DataRow row in src.Rows)
  {
     dest.ImportRow( row ) ;      
  }
}
10、

















ます。https://my.oschina.net/cjkall/blog/195846で再現

おすすめ

転載: blog.csdn.net/weixin_33755557/article/details/91756583