En muchos de los artículos acerca de cómo mejorar el rendimiento de nuestros desarrollos basados en MOSS se hace mención de propiedad SPList.Items. El uso incorrecto de esta propiedad puede hacer que el rendimiento de nuestro desarrollo caiga en picado a medida que aumenta el número de elementos de la lista sobre la que estamos trabajando. Un ejemplo como un código muy simple pero incorrecto puede provocar estos problemas de rendimiento cuando trabajamos con listas grandes lo podemos encontrar en este post de Enrique Blanco.
En resumen, el problema radica en el acceso a la propiedad SPList.Items provoca que se cargue en memoria todos los elementos de la lista. Esto supondría una gran penalización en listas pequeñas si no fuera pro que cada vez que accedemos a un elemento de la lista mediante su índice (SPList.Items[i]) estamos volviendo a cargar por completo los elementos de la lista.
SPList.Items.Add()
Por esta razón, es necesario utilizar la propiedad Items solo cuando sea necesario y teniendo muy claro su funcionamiento. Pero, ¿qué hacemos cuando queremos añadir un elemento a una lista? En este caso, obligatoriamente es necesario acceder a la colección de elementos de la lista para llamar al método Add.

Buscando un poco de información que me aclarara el tema encontré el siguiente artículo, en el cual se habla de un método más eficiente para realizar la inserción de un elemento dentro de una lista de MOSS. El código que se presenta como más eficiente consiste en ejecutar una consulta vacía sobre la lista con el objetivo de no devolver ningún elemento, ya que no es necesario que los elementos estén cargados en la lista para poder realizar una inserción en esta.

Para comprobar la mejora de rendimiento hemos realizado una prueba de carga sobre una aplicación. Dicha aplicación consistía en una página con un WebPart encargado de añadir un elemento a una lista. Este elemento se añadía mediante uno de los dos métodos anteriores dependiendo de un valor de configuración.

Los resultados obtenidos en la ejecución de las pruebas de carga son los siguientes:
En el eje horizontal aparecen el número de inserciones que se realizan en 2 minutos mientras que en el eje vertical aparecen, en primer lugar, el número de usuarios concurrentes y en segundo el número de elementos con los que previamente se había cargado la lista. Como se puede observar en la gráfica no se observa una gran diferencia entre los resultados obtenidos con ambos métodos de inserción.
Cómo funciona la propiedad Items[i]
Mediante el uso de reflector es posible obtener el código de la propiedad Items. Observando el código de la propiedad vemos que internamente realiza una consulta recursiva sobre todos los elementos de la lista mediante el objeto SPQuery, llamando al método GetItems.

Este método genera una colección de elementos de lista que se cargan a partir de los la consulta recibida.

La colección creada no carga los valores dentro de la lista, si no que solo inicializa propiedades internas.

Aquí terminan las llamadas que se realizan cuando se accede a la propiedad ítems. Como se puede observar, la llamada a la propiedad Items no realiza la carga automática de los elementos de la lista. Desensamblando el código de la propiedad SPListCollection.Items[int] obtenemos el momento en el cual es cargada la lista:

¿Por qué no es eficiente la utilización de Items[int] dentro de un bucle? La respuesta es que en cada paso bucle se está realizando una nueva consulta, al accederse a la propiedad Items, que como hemos visto anteriormente, genera la consulta SPQuery, aunque esta no se ejecuta hasta que se accede a la propiedad Items[int]. Por esta razón el añadir un objeto a una lista no llega a ejecutar ninguna consulta, no produciéndose ninguna penalización en función del número de elementos de la lista.