問題

以下のどれが最高のパフォーマンスですか?

私は巨大なパフォーマンスの向上でJavaScriptで実装されたメソッド2を見てきましたが、C#でゲインを測定することができず、メソッド1のように書かれてもコンパイラがすでにメソッド2を実行しているかどうか疑問に思っていました。

方法2の背後にある理論は、コードがすべての反復でDataTable.Rows.Countにアクセスする必要がないことです。単純にint cにアクセスできます。

方法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
}
 

  ベストアンサー

いいえ、値の時間の経過とともに定数を表現する方法がないので、それはできません。

コンパイラがそれを行うことができるはずであれば、値が定数であることを返すコードからの保証が必要であり、ループの期間は変更されません。

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

要するに、end-indexが変数以外のものであれば、コンパイラはその最適化を行いません。

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

結論:あなたが知っている場合、または受け入れようとしている場合、終了ループインデックスはループの持続時間に対して定数であり、それを変数に入れます。


編集:あなたの投稿を読んで、はい、あなたは2つのケースでも無視できるパフォーマンスの向上を見るかもしれません。JITterは、行数を含むデータテーブル内の変数への直接読み込みを最適化する可能性があり、メモリ読み取りはそれほど高価ではありません。一方、そのプロパティを読むことは非常に高価な操作でした。

  同じタグがついた質問を見る

c#performanceloops