Sé que en JavaScript, la creación de un bucle for como este: for(int i = 0; i < arr.length; i++)
es costoso ya que calcula la longitud de la matriz cada vez. Este comportamiento es costoso en C# para listas y arreglos también. ¿O en tiempo de compilación está optimizado? Además, ¿qué pasa con otros lenguajes como Java, cómo se maneja esto?Es costoso hacer array.length o list.count en un bucle
Respuesta
Es no costoso en C#. Por un lado, no hay ningún "cálculo": consultar la longitud es básicamente una operación elemental gracias a la creación de líneas. Y en segundo lugar, debido a que (according to its developers), 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.
En casi cualquier idioma, la respuesta será "depende".
Principalmente, depende de si el compilador es lo suficientemente inteligente como para saber si la longitud de la lista o la matriz pueden cambiar mientras está en el ciclo.
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 cuidado con otros hilos ...
Bueno, para lenguajes como C#, la respuesta definitivamente no es "depende" ya que el comportamiento está bastante bien documentado. –
Si es algo como Java, debe ser un (1) Operación S.
He encontrado útil el siguiente enlace: http://www.devguru.com/Technologies/Ecmascript/Quickref/array.html
También dependerá de si captador que está haciendo un cálculo, o acceder a un valor conocido.
arrays Todo .Net tienen un campo que contiene la longitud de la matriz, por lo que la longitud no se calcula en uso, pero en el momento de la creación.
La máquina virtual .Net es muy buena eliminando cheques de límites 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, si no son solo 2 instrucciones) .
Editar:
Perdón por la rez, pero ¿tiene alguna fuente sobre esto? –
@JacobStamm Ver mi edición –
creo que si se utiliza el método de extensión LINQ Count(), entonces se puede calcular cada vez que se llama.
No para matrices, no. Para las matrices, 'Count' simplemente llama a la propiedad' Length'. –
En realidad, devuelve 'ICollection.Count' para todas las colecciones que implementan' ICollection'. En matrices, esta propiedad se implementa implícitamente; por lo tanto, no lo verá cuando acceda directamente a la matriz. 'ICollection.Count' simplemente devuelve la propiedad' Length' para matrices. –
- 1. ¿El conteo de Linq() es más rápido o más lento que List.Count o Array.Length?
- 2. En C# .NET, ¿cuál es el motivo de array.Length vs. list.Count?
- 3. ¿Qué es más costoso, comparación o asignación?
- 4. ¿Es costoso crear objetos en .Net?
- 5. ¿Es RelativeLayout más costoso que LinearLayout?
- 6. ¿Cuál es el costo de llamar Array.length
- 7. ¿Cómo hacer un bucle ViewPager?
- 8. ¿Es costoso devolver una lista estándar?
- 9. Javascript navegador Peculiaridades - Array.length
- 10. Array.length vs Array.Count
- 11. ¿Por qué asignar o inicializar NSDateFormatter se considera "costoso"?
- 12. ¿Es costoso en Python poner clases en diferentes archivos?
- 13. Sintaxis de un bucle for en ruby
- 14. If (Array.Length == 0)
- 15. String.length() vs Array.length
- 16. ¿Por qué el control NHibernate AutoFlush es tan costoso?
- 17. ¿Por qué Array.Length es un int, y no es un error
- 18. Diferencia entre Array.length = 0 y Array = []?
- 19. ¿Es costoso aferrarse a PreparedStatements? (Java y JDBC)
- 20. Cómo hacer un bucle en NavigableMap en Java
- 21. ¿Cuál es la diferencia entre Array.GetLength() y Array.Length?
- 22. ¿Qué tan costoso es JOINs en SQL? Y/o ¿cuál es la compensación entre el rendimiento y la normalización?
- 23. Cómo hacer un bucle en una aplicación de consola
- 24. Implementación de LINQ: ¿un bucle o muchos?
- 25. ¿Por qué es tan costoso DrawingContext.DrawText de Wpf?
- 26. Agregar expresiones O en un bucle en Linq
- 27. ¿Más rápido para declarar variables dentro de un bucle o fuera de un bucle?
- 28. ¿es posible hacer referencia a una matriz anónima en un bucle for?
- 29. ¿Por qué es más costoso descubrir un defecto más adelante en el proceso?
- 30. ¿Es posible hacer referencia a entradas de lista dentro de un bucle for sin índices?
¿Qué es inlinking, inline? – maxfridbe
Es un error tipográfico. ;-) Gracias. –
en cuanto a JavaScript, utiliza la basura "(var i = 0, mi = arr.length; i
Sciolist