2011-11-09 16 views

Respuesta

5

la segunda. En igualdad de condiciones, el iterador en el segundo caso puede detenerse tan pronto como encuentre una coincidencia, donde el primero debe encontrar todo lo que coincida, y luego elegir el primero de ellos.

+4

Creo que 'Where' resulta en una" proyección "o" secuencia enumerable perezosa "(aunque puede haber un poco más de sobrecarga, no necesita pasar por más elementos de' ResultList', ver nota final), pero elijo el último en la mayoría de los casos ... en el caso de LINQ2SQL o similar, no tengo idea de qué haría el generador de consultas. –

+5

No es cierto: el comportamiento de encadenamiento de LINQ significa que itera perezosamente. Para ambos enfoques, si el primer elemento es una coincidencia, no irán más allá. – Enigmativity

+3

@Enigmativity: eso no es cierto para todos los proveedores de Linq. Si bien es cierto para Linq a los objetos, los proveedores basados ​​en las bases de SQL deben devolver (o al menos procesar) todo el conjunto antes de devolver el primer objeto. En resumidas cuentas, independientemente de las optimizaciones subyacentes que den ciertos proveedores, ya que no se puede confiar en que sea cierto en todos los casos, es mejor optar por lo que conceptualmente siempre daría un comportamiento correcto, en igualdad de condiciones. –

17

Cualquiera está bien.

Ambos funcionan con poca frecuencia: si la lista de fuentes tiene un millón de elementos, pero el décimo elemento coincide, ambos solo iterarán 10 elementos de la fuente.

El rendimiento debería ser casi idéntico y cualquier diferencia sería totalmente insignificante.

+1

Ninguna diferencia es ** insignificante ** - 1ms más de mil elementos llamados por 500 usuarios por día equivalen a mucho tiempo. – TheGeekZn

+4

@NewAmbition: estás hablando menos del uno por ciento de un día. Eso no es mucho tiempo. La diferencia que obtengo cuando comparo los dos enfoques es de 1ms para más de 150,000 elementos (no 1ms para cada elemento, es 1ms para todos los 150,000). Por lo tanto, basándonos en eso, su consulta de 500 x 1000 elementos es de aproximadamente 0.003ms por día. No es significativo. – Enigmativity

+4

Pensé que la palabra sería en cursiva, no en negrita: | Tienes razón, aunque estaba usando un ejemplo inflado. No tenía la intención de sonar douchey, solo que a veces los pequeños éxitos de rendimiento pueden sumar :) – TheGeekZn

Cuestiones relacionadas