![]() |
1
0
我在搜索同一问题的信息时发现了这个。我将添加我所知道的内容,看看是否有帮助: 我在一个WinXP盒子上运行—WPF框架在Vista和Win7中比在XP中集成得多。其中一些原因可能是WPF是如何“在XP桌面上”运行的,而不是在它内部运行的。 我运行的是纯本地WPF应用程序-没有WinForms或其他代码。 我遇到了这个问题,试图确定为什么简单地滚动一个窗口会消耗100%的CPU并在执行时结巴。 运行AQTimePerformanceProfiler,我看到IntGetMessageW占据了CPU使用率100%中最大的一部分。这不是因为IntGetMessageW正在等待消息,而是函数实际正在执行的操作。 我还没有研究的一件事是,也许IntGetMessageW从来就不是一个快速的方法,也许WPF只是滥用了它。WPF中的数据绑定可能使用本机Win32消息泵更新WPF中的依赖属性。如果是这样,可能是我的窗口绑定太多了。 |
![]() |
2
3
是的,这是正常的。任何GUI应用程序都是 总是 正在执行getmessagew(),等待Windows向其发送消息。它实际上并不是在燃烧CPU周期,而是在内部同步对象上阻塞,直到发出某种UI事件的信号。 这当然会使分析UI应用程序变得困难,您确实需要单元测试来测试应用程序的子组件。 |
![]() |
3
1
分析应用程序时,需要区分
花费的时间
以一种方法和
CPU周期
消耗。
许多分析工具向您展示了在一个方法中花费的全部时间——在某些情况下,比如
我建议您从使用AntsProfiler中的采样特性开始,识别调用的方法 最常 并将它们与消耗最多CPU周期的方法关联起来。 一旦您完成了这项工作,您就可以决定在哪里对应用程序进行检测,以便进一步深入了解调用图对于CPU最密集的地方是什么样子的。 首先应该怀疑自己的代码。 很少有像WPF或Win32基础结构这样的东西导致性能低下或CPU利用率高。很可能,问题就在您的实现中的某个地方——它帮助您全面了解程序中CPU周期的使用位置。 我建议你也花些时间 learning the capabilities of the profiler 最有效。 在您了解他们试图向您展示的是什么之前,分析人员可能是复杂和混乱的工具。如果你还没有开始的话,Redgate的链接导师应该是一个很好的开始。例如,时间线视图实际上可能是一个很好的地方,可以开始查看高CPU活动的发生位置,并将您的分析限制在那些执行代码段中。
调用图是蚂蚁中的另一个有用工具,因为它可以帮助您钻取代码中最昂贵的区域。关键是要确保您正在查看 总成本 不仅仅是 全部时间 .
|
![]() |
4
0
看来你的信息泵正在大量输出。看到您的消息队列中充满了什么类型的消息可能很有趣。你能在你的窗口上用spy++看看发生了什么吗? 编辑 我误解了这个问题。 HansPassant是对的,您的程序只是在等待GetMessage来处理一些事件。 |