2008-08-07 11 views
8

次の中で、最もパフォーマンスの良いものはどれですか?DataTableループパフォーマンスの比較

私は巨大なパフォーマンスの向上とJavaScriptで実装する方法2を見てきました、しかし、私はC#で任意のゲインを測定することができませんでしたし、コンパイラはすでに方法1.

のように書かれても、方法2を実行した場合に思っていました方法2の背後にある理論では、コードはすべての反復でDataTable.Rows.Countにアクセスする必要はなく、intに簡単にアクセスできます。

方法1

for (int i = 0; i < DataTable.Rows.Count; i++) { 
    // Do Something 
} 

方法2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) { 
    // Do Something 
} 

答えて

4

値の時間にわたって定数を表現する方法がないので、いいえ、それはそれを行うことはできません。

もしコンパイラがそれを行うことができるならば、値が一定であるという値を返すコードからの保証がなければならず、ループの持続時間は変わらないでしょう。

しかし、この場合、ループの一部としてデータテーブルに新しい行を追加することができます。したがって、実行した方法で保証することはあなた次第です。

つまり、end-indexが変数以外の場合、コンパイラはその最適化を行いません。

コンパイラがループコードを見て、この特定の変数が変更されていないことを確認できる変数の場合は、ループを開始する前にその値をレジスタにロードしますが、ループ本体が空でない限り、これによるパフォーマンスの向上はごくわずかです。

結論:エンドループインデックスがループの持続時間に対して一定であることがわかっている場合、または受け入れる場合は、変数に配置します。


編集:あなたのポストを再読み込み、およびはいジッタがコードを最適化しますので、あなたは、同様にあなたの2例のために無視できる程度のパフォーマンスが向上する可能性があります。 JITterは、エンド・インデックスの読込みを、行数を含むデータ・テーブル内の変数への直接アクセスに最適化することができます。一方、そのプロパティを読むことが非常に高価な操作だった場合は、より顕著な違いが見られます。