Оптимизация запуска приложений .NET - Сборки системы и другие процессы

ОГЛАВЛЕНИЕ

Сборки системы и другие процессы

Исключив загрузку лишних сборок при запуске (дополнительно можно изменить код приложения так, чтобы отложить часть инициализационных процессов), следующим шагом нужно уменьшить объем кода, загружаемого из сборок системы. Я, к сожалению, не знаю средств, которые бы сообщали, сколько загружается кода при использовании системного API. Это было бы весьма полезно, так как разработчик мог бы использовать в коде запуска те API, которые загружают из сборок системы меньше кода. Пока таких средств нет, можно оценить приблизительную нагрузку API с помощью профайлера на основе инструментов (например, Visual Studio® Performance Tools).

Используя данные профайлера, можно попробовать избежать использования API, включающих системные вызовы с большим деревом вызовов (большое дерево, вызовы с глубоким уровнем вложений, значат, что код для каждого метода загружается с диска; таким образом, это способ оценить, какую нагрузку создает вызов). Сэкономить время можно, если ту же функцию удастся реализовать, вызвав API, не имеющий глубокого дерева системных вызовов. Это, конечно, не научный подход, потому что нелегко определить, сколько кода сэкономится при уменьшении дерева вызовов, но в общем случае, чем больше дерево вызовов, тем больше кода будет загружаться с диска.

В некоторых случаях приложение может явно или неявно запускать при загрузке другие процессы. Выяснить это нетрудно с помощью параметра –o отладчика Windows (windbg). За счет параметра –o отладчик присоединяется к любому дочернему процессу. Типичный пример процесса, неявно запускаемого приложением -- когда приложение использует сериализацию XML и не прекомпилирует классы сериализации (с помощью служебной программы Sgen). В этой ситуации для их компиляции запускается компилятор C#. Запуск дополнительных процессов – очень затратное дело, это может иметь большое влияние на скорость загрузки.