Pregunta

Que generalmente es más rápido cuando la lectura y comparación de la fila de la información de una tabla de datos?

'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

Y si hay una diferencia, en qué circunstancias lo hace pagar para hacer uso de uno sobre el otro?

Gracias de antemano por la orientación!

¿Fue útil?

Solución

El compilador expande Para cada uno en un ciclo while corto.

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

Entonces paga una pequeña cantidad de gastos generales. Pero por razones de claridad, aún me quedaría con For Each si solo está trabajando en una fila y no está modificando el conjunto de datos.

Otros consejos

En realidad no hay diferencia. Aunque técnicamente paga un pequeño precio en el método foreach, por pasar por la interfaz IEnumerable.

El segundo tendría una leve penalización. Sin embargo, en cuanto a las circunstancias, siempre usaría el método 2 para mayor claridad del código. Sin embargo, usaría el método 1 si alguna vez necesito hacer algo como acceder a una fila siguiente / anterior mientras analizo la fila actual.

Bueno, hay una diferencia, ya que GetEnumerator y MoveNext que se llaman en foreach-loop son virtuales (la llamada requiere pasar por un puntero) y, por lo tanto, no se pueden alinear. Esta sobrecarga en realidad es pequeña, a menos que haga un lote de bucles.

En algunos casos, aunque el compilador reemplazará foreach con un bucle for (creo que al iterar sobre matrices).

Personalmente prefiero foreach en mi código ASP.NET MVC para mayor claridad, como muchos han dicho aquí, pero a menudo también uso el bucle for. Joe Duffy recientemente publicó un artículo interesante sobre el costo de enumerar http://joeduffyblog.com/2008/09 / 21 / the-cost-of-enumerating-in-net /

@ gdean232 tiene razón, casi no hay diferencia en absoluto. Si el rendimiento es un problema, el uso de un SqlDataReader en su lugar se nota más rápido.

El foreach aplicación es en realidad un poco más rápido que el estándar para la implementación, debido a que cada uno de los índices de la matriz de necesidades de acceso a límites marcada.Sin embargo, desde el lenguaje:

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

es común, el compilador busca como un caso especial y se optimiza, por lo que se vuelve más rápido.Sin embargo, cualquier pequeña desviación de ese formato (como int len = MyArray.Recuento;for(int i =0;yo< len;++i)) no ser reconocido, y su uso será el más lento de código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top