0

DataTable から行情報を読み取り/比較する場合、一般的に最も速いのはどれですか?

'assume dt as datatable'

'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
   ....
next

'method 2'
dim row as datarow
for each row in dt.rows
    ....
next

また、違いがあるとすれば、どのような状況で一方を他方よりも優先して使用するのに費用がかかるのでしょうか?

ご指導いただきありがとうございます。

4

6 に答える 6

8

コンパイラーはForEachを短いwhileループに拡張します。

for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
    row = e.Current

したがって、少量のオーバーヘッドを支払います。ただし、わかりやすくするために、1つの行のみを操作していて、データセットを変更していない場合は、ForEachを使用します。

于 2008-10-09T08:11:07.553 に答える
3

実際には違いはありません。技術的には、foreachメソッドで少額の料金を支払いますが、IEnumerableインターフェイスを通過するために使用します。

于 2008-10-09T08:04:27.660 に答える
3

2番目にはわずかなペナルティがあります。ただし、状況としては、コードを明確にするために、私は常に方法2を使用します。ただし、現在の行を分析しているときに次/前の行にアクセスするなどの操作が必要な場合は、方法1を使用します。

于 2008-10-09T08:07:32.553 に答える
3

foreachループで呼び出されるGetEnumeratorとMoveNextは仮想であり(呼び出しにはポインターを経由する必要があります)、インライン化できないため、違いがあります。多くのループを実行しない限り、このオーバーヘッドは実際には小さいです。

場合によっては、コンパイラーがforeachをforループに置き換えます(配列を反復処理する場合と思います)。

I personally prefer foreach in my ASP.NET MVC code for clarity, as many have said here, but often use the for-loop too. Joe Duffy recently posted an interesting article about the cost of enumerating http://joeduffyblog.com/2008/09/21/the-cost-of-enumerating-in-net/

于 2008-10-09T08:17:52.343 に答える
1

@gdean232は正しいです-ほとんど違いはありません。パフォーマンスが問題になる場合は、代わりにSqlDataReaderを使用する方が目立ちます。

于 2008-10-09T08:08:44.017 に答える
-2

foreachの実装は、各インデックス配列のアクセスを境界チェックする必要があるため、実際には実装の標準よりもわずかに高速です。ただし、イディオム以降:

for(int i =0; i < myArray.Count; ++i)
{
    // do something with myArray[i];
}

一般的に、コンパイラはそれを特殊なケースとして探して最適化するため、高速になります。ただし、その形式からの小さな逸脱(int len = MyArray.Count; for(int i = 0; i <len; ++ i)など)は認識されず、より遅いコードが使用されます。

于 2008-10-09T08:17:49.177 に答える