¿Cuál de estos es el más rápido / mejor?
Éste:
List<User> list = new List<User>();
User u;
foreach (string s in l)
{
u = new User();
u.Name = s;
list.Add(u);
}
O este:
List<User> list = new List<User>();
foreach (string s in l)
{
User u = new User();
u.Name = s;
list.Add(u);
}
Mis habilidades de desarrollo novato me dicen que la primera es mejor, pero un amigo me dice que estoy equivocado, pero que no puede darme una buena razón por la cual la segunda es mejor.
¿Existe alguna diferencia en el rendimiento?
En cualquier caso, la mejor manera sería usar un constructor que tome un Nombre ... o, de lo contrario, explotar la notación de llaves:
o
o incluso mejor, LINQ:
Ahora, mientras que su primer ejemplo podría, en algunos casos, ser imperceptiblemente más rápido, el segundo es mejor porque es más legible y el compilador puede descartar la variable (y omitirla por completo) ya que no se usa fuera del
foreach
alcance del '.fuente
Una declaración no hace que se ejecute ningún código, por lo que no es un problema de rendimiento.
El segundo es lo que quieres decir, y es menos probable que cometas un error estúpido si lo haces de la segunda forma, así que úsala. Intente siempre declarar variables en el ámbito más pequeño necesario.
Y además, la mejor forma es usar Linq:
fuente
Siempre que tenga una pregunta sobre el rendimiento, lo único que debe hacer es medir: ejecutar un ciclo alrededor de su prueba y cronometrarla.
Para responder a su pregunta, sin medir :-) o sin mirar el ilasma generado, ninguna diferencia se notaría en un número significativo de iteraciones y la operación más costosa en su código es probable que sea la asignación de usuarios por algunos pedidos. de magnitud, así que concéntrese en la claridad del código (como debería en general) y vaya con 2.
Oh, es tarde y supongo que solo intento decirte que no te preocupes por este tipo de cosas o te quedes atrapado en detalles como este.
K
fuente
El segundo es mejor. Quiere tener un nuevo usuario en cada iteración.
fuente
Técnicamente, el primer ejemplo ahorrará algunos nanosegundos porque el marco de la pila no tendrá que moverse para asignar una nueva variable, pero esta es una cantidad tan pequeña de tiempo de CPU que no lo notará, eso es si el compilador no lo hace. optimizar cualquier diferencia de todos modos.
fuente
En este escenario, la segunda versión es mejor.
En general, si solo necesita acceder al valor dentro del cuerpo de la iteración, elija la segunda versión. Por otro lado, si hay algún estado final, la variable se mantendrá más allá del cuerpo del ciclo, luego declare y luego use la primera versión.
fuente
No debería haber una diferencia perceptible en el rendimiento.
fuente
Otra referencia que se parece a la de arriba:
http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/d43aaba5-a58b-4610-bea4-5bc5d6741f98
fuente
Fui a verificar este problema. Sorprendentemente descubrí en mis pruebas sucias que la segunda opción es incluso un poco más rápida todo el tiempo.
Verifiqué el CIL pero no es idéntico.
Así que preparé algo para lo que quería que fuera una prueba mucho mejor.
También en este caso, el segundo método siempre ganaba, pero luego verifiqué que el CIL no encontró diferencias.
No soy un gurú de la lectura de CIL, pero no veo ningún problema de declinación. Como ya se señaló, la declaración no es asignación, por lo que no hay una penalización de rendimiento en ella.
Prueba
fuente