13

次のうち、最高のパフォーマンスを発揮するのはどれ?

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
}
4

1 に答える 1

6

いいえ、値の経時定数を表現する方法がないため、それはできません。

コンパイラがそれを行うことができる場合、値が一定であり、ループの期間中は変更されないことを値を返すコードから保証する必要があります。

ただし、この場合、ループの一部としてデータ テーブルに新しい行を自由に追加できるため、これまでの方法でその保証を行うのはユーザー次第です。

つまり、エンドインデックスが変数以外の場合、コンパイラはその最適化を行いません。

変数の場合、コンパイラがループコードを見て、この特定の変数が変更されていないことを確認できる場合、ループを開始する前にそれを実行して値をレジスタにロードする可能性がありますが、これによりパフォーマンスが向上しますループ本体が空でない限り、おそらく無視できるでしょう。

結論: 終了ループ インデックスがループの期間中一定であることを知っている場合、または受け入れる意思がある場合は、それを変数に入れます。


編集:あなたの投稿を読み直してください。そうです、JITterがコードを最適化するため、2つのケースでもパフォーマンスの向上はごくわずかです。JITter は、行数を含むデータ テーブル内の変数への直接アクセスに end-index 読み取りを最適化する可能性があり、とにかくメモリ読み取りはそれほど高価ではありません。一方、そのプロパティの読み取りが非常にコストのかかる操作である場合は、より顕著な違いが見られます。

于 2008-08-07T10:09:58.703 に答える