SPListItemCollection is particularly inefficient because each loop executes a SQL operation

                SPListItemCollection ic = list.GetItems(qry);
foreach (SPListItem subitem in ic)
{
if (subitem.Folder == null)

Doing a foreach across an SPListItemCollection is particularly inefficient because each loop executes a SQL operation to get the next row of the list.

 

It is better to instead do a GetDataTable(), which doesonly one SQL operation. You can then iterate over the DataRow[].