Как я могу оптимизировать производительность моего приложения на основе профиля? - PullRequest
0 голосов
/ 12 апреля 2011

Я профилировал свое приложение и обнаружил, что не мои функции вызывают задержку, которую я вижу, а функции winform.Как я могу это исправить?Для объяснения смотрите:

И это результат профилирования:

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Вы не можете это исправить.

Фреймворк вызывает функцию DispatchMessage , предоставляемую Windows API, которая используется для отправкисообщение, полученное вызовом функции GetMessage в оконной процедуре для определенного окна.

"Медленная" часть здесь - это сама Windows.Когда это становится вашим узким местом, ваше приложение достаточно оптимизируется, и вы больше ничего не можете сделать.

Кроме того, эти результаты профиля не обязательно говорят вам, что эта функция медленная .Скорее, они говорят вам, что называется много («Счетчик обращений»).Идея состоит в том, что функции, которые часто вызываются, являются «горячими точками» в вашем коде, и стоит потратить дополнительное время на оптимизацию их реализации (больше денег).В этом случае, однако, эта функция часто вызывается, потому что именно так Windows обрабатывает сообщения для вашего приложения.В мире неуправляемого кода и собственного API-интерфейса Windows сообщения напоминают события, которые вы используете в коде .NET.Поскольку событие должно вызываться для того, чтобы произошло что-то интересное, функция, которая отвечает за вызов или отправку этих событий (сообщений), должна вызываться много.

1 голос
/ 13 апреля 2011

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

Приложение, которое, кажется, работает хорошо, тратит большую часть времени настенных часов в ожидании следующего внешнегоevent.

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

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

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

Будьте осторожны с профилировщиками, которые вводят вас в заблуждение такими вещами, как 1) рассказывают вам о «времени для себя» из процедур, 2) сообщают вам, сколькокогда вызывается функция, 3) дает вам массивный, но в основном не относящийся к делу график или таблицу, или 4) множество интересных, но обычно не относящихся к делу подсказок, таких как ошибки в кеше и переключатели потоков.

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

...