2011-02-07 5 views
1

Когда я просматриваю свое приложение C# в Visual Studio 2010, в представлении «Линия» вторая функция времени занимает много времени, как System.Windows.Forms.Application.DoEvents(). 7-е место в списке - System.Windows.Forms.Form.ShowDialog(). Эти два потребляют около 8% и 2,5% от общего количества эксклюзивных образцов.Профилирование производительности Visual Studio: Application.DoEvents()

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

Я не уверен, что понимаю, почему вышеупомянутые две функции (DoEvents и ShowDialog) захватывают так много эксклюзивных образцов. Есть ли что-то, что можно сделать для этих двух?

EDIT для уточнения: Приложение имеет 4 разных темы. Один поток считывает данные с внешнего устройства и помещает его в очередь. Другой поток, считывает данные из очереди и выполняет манипулирование данными. Этот интенсивный поток cpu помещает управляемые данные в другую очередь. Третий поток читает эту очередь и регулярно записывает данные на диск. Все потоки реализованы в качестве фона. Конечная (4-я) нить является самой основной формой приложения(). Он фактически неактивен в течение всего процесса.

+0

События обновления и обновления Windows могут быть обработаны при вызове DoEvents. Картина Windows довольно медленная, но не о чем беспокоиться. – CodingBarfield

ответ

1

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

Пока он занимает свое время, просто нажмите кнопку паузы, а затем просмотрите стек в каждом потоке.

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

8% и 2,5% эксклюзивное время - это абсолютно бесполезный hoo-haw. Некоторые вызовы (не функция, функция call) ** в вашем коде находится один из стеков этих потоков a большой процентов времени. Это ваше узкое место, и вы, , увидите.

Это техника random-pausing, и она просто работает.

** Иногда этот пункт пропущен. Разница между функцией и вызовом функции похожа на разницу между чемоданом и рукой, удерживающей ручку. Узкое место не является функцией, это строка кода, которая вызывает функцию (даже если только микрокод). Другие строки кода, вызывающие эту функцию, могут не быть узкими местами.

+0

Интересная идея, однако не применимая к нашему приложению. Причина в том, что мы читаем данные с внешнего устройства во время работы приложения. Когда мы нажимаем паузу, мы начинаем пропускать входящие данные с внешнего устройства (нет возможности «приостановить» внешнее устройство), что приводит к сбою целостности потока данных, т. Е. Данные становятся бессмысленными, и приложение не может продолжать дальше , Спасибо, хотя, ссылка была интересной. – SomethingBetter

+1

@SomethingBetter: Добро пожаловать. На самом деле, я думаю, вы можете это сделать. Просто каждая пауза «жертвенна». Вы запускаете все, что работает нормально, прерывайте его и записывайте стек. Затем вы убиваете его и начинаете все заново. Это как мой помощник, который изучал время анестезии у крыс. Он вводил лекарство, немного подождал, обезглавливал и флеш-замораживал крысу, а потом видел, куда ушло лекарство. Сделал его веганом :) Во всяком случае, это метод. –

+0

@SomethingBetter: Это было непонятно, вам не нужно много образцов. Первоначальные проблемы часто стоят 50% и более, что является возможностью увидеть его каждый раз, и сколько времени вы можете сэкономить, исправив его. Другой способ сказать это: если вы возьмете n = 3 выборки и увидите что-то, что вы можете исправить на s = 2 из них, фиксация этой вещи экономит ваше ожидаемое время (s + 1)/(n + 2) = 60% , (Ожидается в статистическом смысле.) –

0

DoEvents используется для обработки всех сообщений в очереди сообщений Windows. Вам лучше использовать TPL или асинхронную обработку для выполнения длительных задач.

Кроме того, ShowDialog блокируются до тех пор, пока форма не будет закрыта. Этот вопрос Is it possible to use ShowDialog without blocking all forms? объясняет это лучше, чем я могу.

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

1

System.Windows.Forms.Application.DoEvents() почти как сказать «Все логики GUI». Использование DoEvents не рекомендуется и даже может считаться опасным, поскольку оно вводит условия гонки и неуказанное поведение во многих случаях с графическим интерфейсом.

+0

Я не называю приложение Application.DoEvents() в любом месте своего кода. – SomethingBetter

+0

Я скажу, что это опасно. Лучший пример этого - таймер окна, который тикает, не отключает себя, затем выполняет операцию, которая занимает больше времени, чем таймер, а затем вызывает Application.DoEvents. Это в конечном итоге приводит к переходу stackoverflow! (реальная история тоже!) – Quibblesome

Смежные вопросы