2013-12-11 5 views
2

우리는 C# WinForms 응용 프로그램이 매우 느리며 종종 CPU 시간을 50 % 소비합니다.WinForms 응용 프로그램 프로파일 링

DotTrace를 사용하여 가장 시간이 많이 걸리는 작업이 UI 스레드에 있음을 확인했습니다. 특히 System.Windows.Forms.DataGridView.WndProc (Message &)는 대부분의 시간을 소모합니다.

프로그램이 DataGridView 컨트롤에서 Invoke 또는 BeginInvoke를 호출한다는 것을 알고 있습니다. 이는 DataGridView 컨트롤에 메시지를 보내는 것과 같습니다. 그러나 호출 스레드가 해당 메시지를 보내는 데 소요되는 시간은 매우 작습니다. 대부분의 시간은 UI 스레드에서 해당 메시지를 처리하는 데 소요됩니다.

그래서 dotTrace는 UI 스레드에서 가장 시간이 많이 걸리는 작업을 파악할 수 있지만 해당 스레드를 보내는 스레드를 파악할 수 없습니다.

그렇다면이 스레드를 찾으려면 어떻게해야합니까?

+2

"우리는 C# Winform 응용 프로그램이 매우 느리며 종종 CPU 시간이 50 %라고 가정합니다." - 정말 ? 정말 느린 경우 스파이크가 그보다 훨씬 높을 것으로 예상됩니다 ... UI 업데이트 폭풍이 발생 했습니까? 그건 UI 업데이트가 다른 업데이트와 캐스케이드를 유발한다는 의미입니다. –

+0

@MitchWheat 예, Windows 작업 관리자를 사용하여 프로그램을 모니터링했습니다. CPU 사용은 항상 약 50 %입니다. 실제로이 프로그램은 거래 플랫폼입니다. 그것은 지속적으로 외부로부터 견적 정보, 주문 상태 정보 등을 받고, 일부 계산을 수행 한 다음 UI를 업데이트합니다. 우리는 매회 약 100 건의 주문을 발행 할 수 있도록 자동 거래 대행사를 작성하고 있습니다. 모든 수신 메시지를 신속하게 처리 할 수 ​​없음을 발견했습니다. 그래서 병목 현상이 무엇인지 알아 내야합니다. UI 인 경우 UI 업데이트의 원인을 찾아야하며 업데이트 빈도가 느려질 수 있습니다. – rmm2014

+0

DataGridVew에서 프로세스가 길거나 여러 번 트리거되는 이벤트가 있거나 셀 값 변경 또는 행 추가와 같이 끝없이 활성화되는 이벤트가있을 수 있습니다. – Jade

답변

0

우선, Windows 응용 프로그램의 경우 wndproc이 가장 많이 불리우며 시간이 오래 걸릴 것으로 예상됩니다. 모든 것을 처리하는 응용 프로그램의 핵심입니다. 마우스로 컨트롤 위로 마우스를 가져 가면 wndproc 핸들러가 마우스가 교차하는 거의 모든 픽셀에 대해 호출됩니다. 이는 꽤 할당 된 것입니다!

그렇다면 이러한 이벤트 처리는 효율적으로 작성되어야합니다. 큰 작업은 실제 작업이 시작되기 전에 마지막 메시지 이후에 작은 시간 제한 시간 만 남겨서 지연되어야합니다. 메시지의 발신자는 쉽게 검색 할 수 없으므로 메시지의 출처를 검색하는 것은 매우 어려운 작업입니다 (일반적으로 BeginInvoke를 지나치게 호출하지 않는 한 OS입니다).

힌트를 줄 수있는 편리한 도구는 SoftwareTrails입니다. 최근 사용 된 클래스의 히트 맵을 제공합니다. 앱에서 주변을 클릭하면서 화면의 한면에 고정시킵니다. 시스템 및 Microsoft 네임 스페이스에서 대부분의 활동을 볼 수 있으며, 자신의 활동은 거의 볼 수 없습니다. 그렇지 않은 경우 MouseHover 이벤트 또는 기타 사항을 처리하는지 확인하십시오.

Windows 응용 프로그램에서 wndproc이 가장 많이 호출되는 루틴은 완전히 정상입니다. 코멘트를 읽은 후

편집 : 당신은 꽤 충당 Invoke 또는 BeginInvoke를 호출, 그래서 당신의 프로파일에 그 방법을 찾아 그들을 호출 있는지 확인하기 위해 호출 그래프를 사용하는 것처럼

보인다. DotTrace에 전체 콜 그래프가 있는지 확실하지 않은 경우에는 콜 트리가 있지만 함수를 호출하는 모든 호출자를 볼 수있는 그래프가 필요합니다. 콜 그래프를 포함하는 많은 프로파일 러가 있습니다.

관련 문제