¿Vale la pena inicializar el tamaño de la colección de una Lista si su tamaño es razonablemente conocido?

¿Vale la pena inicializar el tamaño de la colección de una List si es razonablemente conocida?

Editar: Al seguir con esta pregunta, después de leer las primeras respuestas, esta pregunta se reduce a cuál es la capacidad predeterminada y cómo se realiza la operación de crecimiento, ¿duplica la capacidad, etc.?

Sí, será importante cuando su List se agrande. Los números exactos dependen del tipo de elemento y de la architecture de la máquina, seleccione una Lista de tipos de referencia en una máquina de 32 bits. Cada elemento tomará 4 bytes dentro de una matriz interna. La lista comenzará con una Capacidad de 0 y una matriz vacía. La primera llamada Add() aumenta la Capacidad a 4, reasignando la matriz interna a 16 bytes. Cuatro llamadas Add() más tarde, la matriz está llena y necesita ser reasignada de nuevo. Dobla el tamaño, la capacidad crece a 8, el tamaño de la matriz a 32 bytes. La matriz anterior es basura.

Esto se repite cuando sea necesario, varias copias de la matriz interna se convertirán en basura.

Algo especial sucede cuando la matriz ha crecido a 65.536 bytes (16.384 elementos). El siguiente Add () duplica el tamaño nuevamente a 131,072 bytes. Esa es una asignación de memoria que excede el umbral para “objetos grandes” (85,000 bytes). La asignación ya no se realiza en el montón de generación 0, sino que se toma del montón de objetos grandes.

Los objetos en el LOH se tratan especialmente. Solo son basura recolectada durante una colección de generación 2. Y el montón no se compacta, se necesita demasiado tiempo para mover fragmentos tan grandes.

Esto se repite cuando sea necesario, varios objetos LOH se convertirán en basura. Pueden ocupar la memoria durante bastante tiempo, las colecciones de la generación 2 no ocurren muy a menudo. Otro problema es que estos bloques grandes tienden a fragmentar el espacio de direcciones de la memoria virtual.

Esto no se repite interminablemente, tarde o temprano la clase List necesita reasignar la matriz y ha crecido tanto que no queda un agujero en el espacio de direcciones de la memoria virtual para ajustarse a la matriz. Tu progtwig bombardeará con una OutOfMemoryException. Por lo general, mucho antes de que se haya consumido toda la memoria virtual disponible.

Para resumir, estableciendo la capacidad antes de tiempo, antes de comenzar a llenar la lista, puede reservar esa gran matriz interna por adelantado. No obtendrá todos esos bloques lanzados torpes en el Heap de objetos grandes y evitará la fragmentación. En efecto, podrás almacenar muchos más objetos en la lista y tu progtwig se ejecutará más rápido ya que hay muy poca basura. Haga esto solo si tiene una buena idea de lo grande que será la lista, usar una gran Capacidad que nunca llenará es un desperdicio.

Es, según la documentación

Si se puede estimar el tamaño de la colección, al especificar la capacidad inicial se elimina la necesidad de realizar una serie de operaciones de cambio de tamaño al agregar elementos a la Lista (T).

Bueno, le impedirá que los valores en la lista (que serán referencias si el tipo de elemento es un tipo de referencia) tengan que copiarse ocasionalmente a medida que la lista crece.

Si va a ser una lista particularmente grande y tienes una idea bastante buena del tamaño, no va a doler. Sin embargo, si la estimación del tamaño implica cálculos adicionales o una cantidad significativa de código, no me preocuparía a menos que encuentre que se convierta en un problema: podría distraer la atención del foco principal del código y es poco probable que el cambio de tamaño cause un rendimiento problemas a menos que sea una lista realmente grande o lo estés haciendo mucho.