質問

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

そして、違いがある場合、どのような状況で一方を他方に使用することで支払うのですか?

ご指導ありがとうございます!

役に立ちましたか?

解決

コンパイラはFor Eachを短いwhileループに展開します。

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

そのため、わずかなオーバーヘッドを支払います。ただし、わかりやすくするために、1行だけを操作していて、データセットを変更していない場合は、For Eachを使用します。

他のヒント

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

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

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

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

個人的には、ASP.NET MVCコードでforeachを好んで使用しています。多くの人がここで言っているように、多くの場合forループも使用しています。 Joe Duffyは最近、列挙のコストに関する興味深い記事を投稿しました http://joeduffyblog.com/2008/09 / 21 / the-cost-of-enumerating-in-net /

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top