Conjunto de matrices

Dec 15 2022
Hoy en día, rara vez usamos arreglos. En la mayoría de los casos, usamos List<T>, que proporciona más funciones y se basa en una matriz bajo el capó.

Hoy en día, rara vez usamos arreglos. En la mayoría de los casos, usamos List<T>, que proporciona más funciones y se basa en una matriz bajo el capó. Pero hay situaciones en las que el rendimiento es la clave al tratar con muchos objetos.

Lo que me ha sorprendido es que una matriz simple es el doble de eficiente que una Lista, y aún puede optimizarse con ArrayPool.

En este artículo, le mostraré cómo usar ArrayPool con ejemplos de código y rendimiento de evaluación comparativa.

Repositorio de código

¿Qué es ArrayPool?

ArrayPool es un grupo de recursos que permite reutilizar instancias de tipos de matrices. Puede usarlo para alquilar y devolver búferes (matrices). Mejorará el rendimiento cuando cree y destruya matrices con frecuencia, que consumen mucha memoria y GARBAGE COLLECTOR . Esta clase es segura para subprocesos y puede usarla simultáneamente. Mientras regresa al grupo, puede optar por borrar o no el contenido de la matriz. La limpieza llevará más tiempo, pero su situación puede requerir obtener una matriz vacía cada vez.

Cómo usarlo

Hay dos formas de acceder a las matrices desde la memoria del grupo.

La primera y más simple es usar la propiedad ArrayPool Shared .

ArrayPool<T>.Compartido

Obtendrá la implementación predeterminada del grupo. Contiene matrices de diferentes tamaños. Puede devolver una matriz más grande de la que ha solicitado, pero ciertamente no más pequeña. Un grupo compartido es una forma conveniente de reutilizar arreglos, pero hay mejores.

La forma más eficiente es inicializar su grupo usando métodos de creación.

ArrayPool<T>.Create()

ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)

El método Create devuelve una instancia personalizada del grupo. Debe almacenarlo en caché para acceder a él desde diferentes ubicaciones para reutilizarlo. El método parametrizado puede ayudar a lograr el mejor rendimiento. Creará una instancia que agrupa arreglos de una longitud no superior a maxArrayLength en cubos de tamaño maxArraysPerBucket.

Aproveche la agrupación de matrices en C# para reducir las asignaciones y mejorar el rendimiento de sus aplicaciones.

Punto de referencia

Esta es una prueba sencilla. Compararemos las diferencias entre crear una nueva matriz y alquilarla del grupo. En cada caso, iteraremos sobre una colección de 1_000_000 elementos. También incluiré List<T> en el punto de referencia para mostrar las ventajas de rendimiento de las matrices.

Repositorio de código

punto de referencia

Conclusiones

Lo que más me ha sorprendido es que una matriz simple es dos veces más eficiente que una Lista en términos de velocidad y uso de memoria. Y todavía se puede optimizar con ArrayPool. Usar una piscina es obviamente el camino a seguir.

Hay una diferencia de tiempo notable entre usar una matriz estándar y una del grupo. La diferencia de tiempo es el tiempo requerido para asignar memoria al crear una nueva matriz cada vez. Por supuesto, también hay una diferencia en la asignación de memoria. ArrayPool no necesita asignar nueva memoria. Reutiliza el mismo bloque.

Como advertencia, he agregado 'Grupo personalizado sin almacenamiento en caché' para que pueda ver qué sucede cuando crea un nuevo grupo cada vez. Es básicamente lo mismo que crear una nueva matriz cada vez.

En este ejemplo simple, es difícil mostrar la diferencia de rendimiento entre ArrayPool compartido y personalizado. Sería notable cuando se utilizan muchas matrices de diferentes tamaños.

El uso de ArrayPool puede no ser siempre lo más conveniente, pero a veces puede ahorrarle mucha potencia informática cuando sea necesario.