2009-07-02 2 views
6

Я пишу плагин для другой программы на C# .NET, и у меня проблемы с производительностью, когда команды занимают намного больше времени, чем я. Плагин реагирует на события в главной программе, а также зависит от методов утилиты SDK хост-программы. У моего плагина много рекурсивных функций, потому что я много читаю и записываю в древовидную структуру. Кроме того, у меня есть много подписчиков на события между моим плагином и хост-приложением, а также подписки на события между классами в моем подключаемом модуле.Каков наилучший способ отладить проблемы с производительностью?

Как я могу выяснить, что требуется для завершения задачи? Я не могу использовать обычную отладку стиля точки останова, потому что дело не в том, что она не работает, просто потому, что она слишком медленная. Я установил статический класс «LogWriter», который я могу ссылаться со всех моих классов, что позволит мне записывать временные строки в файл журнала из моего кода. Есть ли другой способ? Визуальная студия хранит какой-то временный журнал, который я мог бы использовать вместо этого? Есть ли способ просмотреть стек вызовов после закрытия приложения?

ответ

15

Вы должны использовать профайлер. Здесь ссылка на хороший: ANTS Performance Profiler.

Обновление: Вы также можете писать сообщения в контрольных точках, используя Debug.Write. Затем вам нужно загрузить приложение DebugView, которое отображает всю строку отладки с точной меткой времени. Это бесплатная и очень хорошая для быстрой отладки и профилирования.

+0

Red Gate наверняка делает хорошее программное обеспечение. На мой взгляд, их профилировщик ANTS является одним из лучших. Я считаю, вы можете скачать пробную версию. Большинство людей, которые впоследствии покупают настоящую версию, так что будьте осторожны :). – bastijn

+1

Ну, профилировщик Microsoft тоже хорош, но он включен только в дорогие пакеты VS. – arbiter

+0

Thumbs up for ANTS от меня тоже, разрешил огромную утечку памяти для меня –

1

Похоже, что вы хотите использовать «профайлер» кода. http://en.wikipedia.org/wiki/Code_profiler#Use_of_profilers

Я не знаком с тем, какие профилировщики являются лучшими для C#, но я наткнулся на эту ссылку после быстрого google, в котором есть список бесплатных предложений с открытым исходным кодом. Я уверен, что кто-то будет знать, какие из них заслуживают внимания :)

http://csharp-source.net/open-source/profilers

1

Несмотря на название этой темы, я должен утверждать, что «лучший» способ субъективен, мы можем предложить только возможные решения.

У меня был опыт использования Redgate ANTS Performance Profiler, который покажет вам, где узкие места находятся в вашем приложении. Это определенно стоит проверить.

4

My Profiler List Включает ANTS, dotTrace и AQtime.


Однако, присмотревшись на ваш вопрос, мне кажется, что вы должны сделать некоторые модульное тестирование в то же время вы делаете профилирование. Возможно, начните с быстрого обзора производительности всего лишь для того, чтобы узнать, какие области требуют наибольшего внимания. Затем начните писать некоторые модульные тесты для этих областей. Затем вы можете запустить профилировщик во время выполнения этих модульных тестов, чтобы получить согласованные результаты.

1

Система Visual Studio Team System имеет профайлер, запеченный в своем, далеко не идеальный, но для простых приложений вы можете заставить его работать.

В последнее время я добился наибольшего успеха с помощью бесплатного профилирования EQATECs, или, при необходимости, свертывания собственного крошечного класса профилирования.

Кроме того, там было немало вопросов о профайлеров в этом прошлом SEE: http://www.google.com.au/search?hl=en&q=site:stackoverflow.com+.net+profiler&btnG=Google+Search&meta=&aq=f&oq=

+0

+1 для указания на профайлер, который для меня новый. – arbiter

0

Вы также можете использовать счетчик производительности для приложений ASP.NET.

2

В моем опыте лучший метод также является самым простым. Запустите его, и пока он идет медленно, нажмите кнопку «пауза» в среде IDE. Затем сделайте запись стека вызовов. Повторите это несколько раз. (Here's a more detailed example and explanation.)

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

Все, что вызывает значительное количество времени для потребления, будет обнаружено этим методом, и рекурсия не беспокоит его.

Люди, кажется, для решения проблем, как это в одном из двух способов:

  1. Try, чтобы получить хорошие измерения, прежде чем делать что-нибудь.

  2. Просто найдите что-то большое, от которого вы можете избавиться, вырвать его и повторить.

Я предпочитаю последний, потому что это быстро, и потому, что вы не должны точно знать, насколько велика опухоль, чтобы знать, что это достаточно большой, чтобы удалить. То, что вам нужно знать, именно там, где оно есть, и это то, что этот метод говорит вам.