Я предполагаю, что вы вызываете Trace.Indent () для каждой строки, не вызывая Trace.Unindent (), что приводит к тому, что уровень отступа продолжает расти.
Предполагается, что у вас есть 2000 строк для обработки, и в настоящее время вы обрабатываете 1000-ю строку, что делает IndentLevel 1000. Предполагается, что отступ представлен символом Unicode '\ t' (предполагается, что UTF-16, что составляет 2 байта на символ)).Затем, в этот момент, чтобы создать трассировку отладки, около 2 КБ памяти должно быть выделено для этой конкретной трассировки в итерации.Выделение такого объема памяти не является дешевой операцией, и вы фактически увеличиваете размер записи трассировки в каждой итерации.
Кроме того, мне не ясно, когда память будет освобождена сборщиком мусора.Другими словами, когда основная инфраструктура отладки будет выполняться с использованием памяти.Поскольку вы создаете длинные записи трассировки довольно часто, скорее всего, она исчерпает кучу Gen1.Когда включается сборщик мусора и некоторые строки трассировки не обрабатываются инфраструктурой отладки, они также переходят в кучу Gen2.Это увеличит размер рабочего набора вашего процесса, что снова может замедлить ваш процесс.
Вы можете проверить счетчики производительности .NET для своего приложения.Я бы проверил Размер кучи Gen1, Gen2, Gen3, общий размер кучи, # Gen1, Gen2, Gen3 сборки мусора.Чем выше сборка мусора Gen в вашем приложении, тем медленнее будет и ваше приложение.
Это всего лишь мое приблизительное предположение.