length len array c# compiler-construction performance language-features

array - list int length c#



¿Es costoso hacer array.length o list.count en un bucle? (6)

Creo que si usas el método de extensión Linq Count (), entonces puede calcular cada vez que se invoca.

Sé que en JavaScript, crear un ciclo for como este: for(int i = 0; i < arr.length; i++) es costoso ya que calcula la longitud de la matriz cada vez. ¿Es este comportamiento costoso en c # para listas y matrices también? ¿O en tiempo de compilación está optimizado? Además, ¿qué pasa con otros lenguajes como Java, cómo se maneja esto?


En casi cualquier idioma, la respuesta será "depende".

En su mayoría, depende de si el compilador es lo suficientemente inteligente como para saber si la longitud de la lista o matriz puede cambiar mientras está en el bucle.

Sin embargo, es poco probable que esté definido por la especificación del lenguaje.

Por lo tanto, es seguro asumir que la compilación puede no ser capaz de resolver eso. Si realmente cree que la longitud del objeto no cambiará, no dude en calcular la longitud primero y usarla en las construcciones de control de lazo.

Pero ten cuidado con otros hilos ...


No es costoso en C #. Por un lado, no hay un "cálculo": consultar la longitud es básicamente una operación elemental gracias a la creación de líneas. Y en segundo lugar, porque (de acuerdo con sus desarrolladores ), el compilador reconoce este patrón de acceso y, de hecho, optimizará cualquier control de límites (redundante) para acceder a los elementos de la matriz.

Y, por cierto, creo que algo similar es cierto para las máquinas virtuales JavaScript modernas, y si no lo es, será muy pronto ya que esta es una optimización trivial.



También dependerá de si ese getter está haciendo un cálculo o accediendo a un valor conocido.


  1. Todas las matrices .Net tienen un campo que contiene la longitud de la matriz, por lo que la longitud no se calcula en el momento del uso, sino en el momento de la creación.

  2. La máquina virtual .Net es muy buena para eliminar los límites de verificación siempre que sea posible, este es uno de esos casos, donde la verificación de límites se mueve fuera del bucle (en la mayoría de las situaciones, y si no es solo 2 instrucciones generales).

Editar:

Array Bounds Check Elimination