¿Cuál es el impacto en el uso de la memoria del uso de muchos iteradores en C#? Supongamos un programa que realiza miles de bucles foreach
- ¿asigna cada bucle un objeto temporal en el montón mediante una llamada al GetEnumerator
? ¿Realiza el CLR algún tipo de optimización (por ejemplo, asignación de pila de objetos IEnumerator
)? ¿O simplemente no es un tema lo suficientemente importante como para preocuparse?Uso de la memoria de los iteradores en C#
Respuesta
Simplemente no es lo suficientemente importante como para preocuparse en la mayoría de los casos. Como Eric señala, puede haber algunos casos de en los que es importante, pero son pocos y están separados en mi experiencia.
Si está haciendo cientos de miles de bucles foreach
, presumiblemente está haciendo trabajo dentro de esos bucles. Es casi seguro que será más más importante que los iteradores mismos.
Tenga en cuenta que el uso de foreach
en una matriz (que se sabe que es una matriz en tiempo de compilación), no utiliza IEnumerable<T>
de todos modos: utiliza la indexación directa. Sin embargo, no cambiaría mi código basado en esto.
Como siempre, si le preocupa el rendimiento, debe medirlo y perfilarlo. Los cuellos de botella casi nunca están donde usted espera que estén.
A menudo el compilador puede optimizar un bucle foreach en un bucle simple, que solo requiere una variable de índice en la pila (o en un registro de procesador).
Si todavía se utiliza un iterador, la mayoría de ellos son estructuras, por lo que solo se asignan en la pila en lugar de en el montón.
Los pocos iteradores que son clases todavía son bastante pequeños y rápidos. Podrías crear millones de ellos sin un impacto notable.
Suena genial ... Pregunta de seguimiento rápida: si implemento la interfaz IEnumerable, por definición, el método GetEnumerator devuelve un IEnumerator. Si mi iterador personalizado es una estructura, supongo que, por lo tanto, se devolverá como un objeto encuadrado. –
Jen, cuidadosamente, mira cómo lo hace List
Pero de nuevo, como dice Jon, no hagas esto tonto a menos que tengas datos sólidos que creen enumeradores en el montón es la causa principal de un problema de rendimiento impactante para el cliente en el mundo real. Los tipos de valores mutables causan todo tipo de problemas extraños que son costosos de depurar y difíciles de entender. –
- 1. Uso correcto de los bloques iteradores
- 2. uso de multiproceso de `iteradores ConcurrentHashMap`
- 3. Uso de iteradores sobre índices de matriz
- 4. devolver iteradores de C++
- 5. ¿Cómo evitar quedarse sin memoria en la aplicación de uso de memoria alta? C/C++
- 6. iteradores de C++ considerados dañinos?
- 7. uso de la memoria de los constructores en Haskell
- 8. iteradores de estilo de Python en C
- 9. Zip Varios iteradores en C++
- 10. pérdida de memoria Uso de JSON-C
- 11. Eficiencia de iteradores en unordered_map (C++)
- 12. ¿Cómo uso los iteradores anidados con Mustache.js o Handlebars.js?
- 13. C#: uso de la memoria de un objeto
- 14. Comparar iteradores, C++
- 15. uso de la memoria en I
- 16. Detener en los iteradores del último elemento C++
- 17. ¿Qué son iteradores, C++?
- 18. C# Dictionary y uso eficiente de la memoria
- 19. C++ Gestión de la memoria
- 20. Cómo obtener el uso de memoria en Windows en C++
- 21. Iteradores entendimiento en la STL
- 22. ¿La precedencia del operador en C++ difiere para los punteros y los iteradores?
- 23. Aumente los iteradores de Property_Tree, cómo manejarlos?
- 24. Minimizando la huella de memoria en los programas C
- 25. Cómo aplanar los iteradores de contenedores anidados?
- 26. ¿Cuál es el tiempo de vida y la validez de los iteradores de C++?
- 27. C# punteros, iteradores y genéricos
- 28. ¿Se beneficiaría C# de las distinciones entre tipos de enumeradores, como los iteradores de C++?
- 29. Redis: uso de la memoria de supervisión
- 30. Uso de memoria del proceso actual en C
Aunque es, como siempre, un excelente consejo de Jon, nuestras pruebas de rendimiento mostraron un impacto significativo en el rendimiento de la asignación de montones/recolección de basura de iteradores en algunos escenarios del mundo real. Es por eso que el enumerador de la Lista es un tipo de valor mutable malvado en lugar de un tipo de referencia. Pero, por supuesto, la frase clave es "nuestras pruebas de rendimiento": como usted nota, es una tontería tomar decisiones de rendimiento sin datos. –
Ah sí, el mal mutable 'lista' iteradores - Me parece recordar una publicación de grupo de noticias con lo que parecía una pieza razonable de código pero que dio algunos resultados muy extraños debido exactamente a la decisión de diseño :) Editaré la respuesta de todos modos ... las afirmaciones generales de "no es significativo" rara vez son una buena idea. –