entiendo que la ejecución de las operaciones en diferentes órdenes implica un funcionamiento diferente, como la diferencia entre la siguiente consulta lenta:¿El orden del predicado es importante cuando se usa LINQ?
List<TestItem> slowResults = items.OrderBy(item => item.StringItem)
.Where(item => item.IntItem == 100)
.ToList();
y esto uno más rápido:
List<TestItem> fastResults = items.Where(item => item.IntItem == 100)
.OrderBy(item => item.StringItem)
.ToList();
Pero eso no es mi pregunta:
Mi pregunta es sobre el rendimiento del cortocircuito ya que relaciona tes a un predicado LINQ. Cuando uso una cláusula WHERE, como en este caso:
List<TestItem> results = items.Where(item => item.Item1 == 12 &&
item.Item2 != null &&
item.Item2.SubItem == 65 &&
item.Item3.Equals(anotherThingy))
.ToList();
¿No importa el orden de los argumentos? Por ejemplo, esperaría que hacer un .Equals primero resulte en una consulta más lenta en general debido a que la evaluación entera Item1 == 12 es una operación mucho más rápida?
Si el orden es importante, ¿cuánto importa? Por supuesto, los métodos de llamada como .Equals probablemente resulten en una desaceleración mucho más grande que si simplemente estuviera comparando algunos enteros, ¿pero es una penalización de rendimiento relativamente pequeña en comparación con la forma en que opera LINQ "lento"? Como LINQ hace toneladas de llamadas a métodos, algo como .Equals realmente va a importar, ya que, a menos que sea anulado, estará ejecutando código de framework nativo, ¿no? Por otro lado, ¿la llamada a un método MSIL estándar va a ser significativamente más lenta?
Además, ¿hay otras optimizaciones del compilador en esta consulta que podrían acelerar esto bajo el capó?
Gracias por los pensamientos y la aclaración! Brett
¿LINQ a qué? – SLaks
Estaba pensando en LINQ to Objects, pero supongo que la pregunta es aún más importante para LINQ to SQL. – Brett
Aunque no conozco LINQ____, si es como otros lenguajes en cortocircuito, el orden es importante, porque si la expresión que se va a evaluar alguna vez se convierte definitivamente en verdadera o definitivamente falsa, el resto de los predicados se pueden descartar con seguridad. Por ejemplo, en la expresión '(1 == 1 || x == 3)', 'x == 3' nunca se evaluará porque no importa cuál sea el resultado, la expresión será verdadera. Un ejemplo simple similar podría ser '(1 == 0 && x == 3)', donde después de que '1 == 0' se encuentre como falso, simplemente se cierra porque no hay forma de que la expresión sea verdadera. Lo siento si esto no es lo que estás buscando! – prelic