¿Es una declaración LINQ más rápida que un bucle 'foreach'?
Estoy escribiendo un administrador de renderizado de malla y pensé que sería una buena idea agrupar todas las mallas que usan el mismo sombreador y luego renderizarlas mientras estoy en ese pase de sombreado.
Actualmente estoy usando un foreach
bucle, pero me preguntaba si utilizar LINQ podría aumentar mi rendimiento.
¿Por qué LINQ debería ser más rápido? También utiliza bucles internamente.
La mayoría de las veces, LINQ será un poco más lento porque introduce gastos generales. No utilice LINQ si le importa mucho el rendimiento. Utilice LINQ porque desea un código más corto, mejor legible y mantenible.
LINQ-to-Objects generalmente agregará algunos gastos generales marginales (múltiples iteradores, etc.). Todavía tiene que hacer los bucles y tiene invocaciones de delegados, y generalmente tendrá que hacer algunas desreferenciaciones adicionales para llegar a las variables capturadas, etc. En la mayoría de los códigos, esto será prácticamente indetectable y más que el código más simple de entender.
Con otros proveedores de LINQ como LINQ-to-SQL, dado que la consulta se puede filtrar en el servidor, debería ser mucho mejor que un flat foreach
, pero lo más probable es que no hubieras hecho una manta "select * from foo"
de todos modos , por lo que no es necesariamente justo comparación.
Re PLINQ; el paralelismo puede reducir el tiempo transcurrido , pero el tiempo total de CPU normalmente aumentará un poco debido a los gastos generales de la gestión de subprocesos, etc.
LINQ es más lento ahora, pero podría volverse más rápido en algún momento. Lo bueno de LINQ es que no tienes que preocuparte por cómo funciona. Si se idea un nuevo método que sea increíblemente rápido, la gente de Microsoft podrá implementarlo sin siquiera avisarte y tu código será mucho más rápido.
Sin embargo, lo más importante es que LINQ es mucho más fácil de leer. Ésa debería ser razón suficiente.
Probablemente debería señalarse que el for
bucle es más rápido que el foreach
. Entonces, para la publicación original, si le preocupa el rendimiento de un componente crítico como un renderizador, use un for
bucle.
Referencia: En .NET, ¿qué bucle se ejecuta más rápido, 'for' o 'foreach'?
Es posible que obtenga un aumento de rendimiento si utiliza LINQ paralelo para múltiples núcleos. Consulte LINQ paralelo (PLINQ) (MSDN).