Это очень общий вопрос :), но вот некоторые рекомендации
- Измерьте время запуска вашего приложения, если запуск представляет большую проблему для ваших клиентов, рассмотрите возможность использования службы Ngen, использование службы ngen (ngen.exe) значительно повышает производительность при холодном запуске
- Рабочий набор и куча GC: как выглядит ваша куча gc; особенно твой LOH. LOH в CLR не сжимается, поэтому важно, чтобы LOH был маленьким, или использовать методы кэширования для повторного использования объектов в LOH (куча больших объектов содержит объекты, размер которых превышает 85000 байт).
- Пропускная способность: сколько операций вы можете выполнить, какое время отклика для вашего приложения, если оно имеет пользовательский интерфейс, сколько запросов оно может обработать, если оно является серверным приложением .. и т.д.
Что касается диагностики и трассировки, вы можете использовать классы в пространстве имен System.Dignostics, например, TraceListner, вы также можете учитывать события ETW для ваших критических путей кода (хорошая трассировка событий для Windows в MSDN).
Вы можете создавать свои собственные пользовательские классы dignostic поверх встроенных классов в пространстве имен System.Dignostics.
Пара очень полезных инструментов, которые вам необходимо иметь в своей сумке для захвата, это VS Profiler и CLR profiler для профилирования времени и профилирования памяти соответственно.
Вы можете использовать профилировщик для общего представления о ваших «горячих» функциях, вы можете использовать класс StopWatch для измерения времени для некоторых выбранных методов или для синхронизации с высоким разрешением, вы можете использовать QueryPerformanceCounter и QueryPerformanceFrequency Windows APIs