我已经分析了我的应用程序并发现我的功能并没有导致我看到的延迟,但winform功能 - 我怎么能纠正这个,为了解释,请看:
这是分析的结果:
http://www.megaupload.com/?d=2YUQWVQ6(导出为html格式)
答案 0 :(得分:2)
你无法解决这个问题。
框架调用Windows API公开的DispatchMessage
function,用于将通过调用GetMessage
函数检索到的消息发送到特定窗口的窗口过程。< / p>
这里的“慢”部分是Windows本身。当这成为你的瓶颈时,你的应用程序就会得到充分优化,你无能为力。
此外,这些个人资料结果并不一定告诉您此功能慢。相反,他们告诉你它被称为很多(“命中计数”)。我们的想法是,大量调用的函数是代码中的“热点”,值得花一些时间来优化它们的实现(更多的是为了降压)。但是,在这种情况下,该函数会被调用很多,因为它是Windows处理应用程序消息的方式。在非托管代码和本机Windows API的世界中,消息有点像您在.NET代码中使用的事件。由于必须针对任何有趣的事件引发事件,因此负责调用或调度这些事件(消息)的函数必然会被调用很多。
答案 1 :(得分:1)
Windows应用程序通常包含一个顶级循环,用于等待外部事件,如鼠标移动/点击和键盘命中,或内部生成的事件。当一个事件发生时,它会调用适当的处理程序,这可能会做一些或很多。通常它会走一条相当广泛而深度的调用树,但如果它快速完成,它就会回到等待状态。
看似表现不错的应用程序花费了大部分挂钟时间等待下一次外部事件。
似乎表现不佳的应用程序花费了大部分时间来响应事件而行走呼叫树。
提高性能的方法是找到瓶颈并将其删除。瓶颈几乎总是由调用树中的函数调用组成,在您的代码中,您不知道这些函数是昂贵的。调用树中不属于您的代码的部分是您无法做任何事情的事情,但如果您可以避免调用它们,您就有机会获得加速。
就像你是一名经理一样,想看看你的员工是否在浪费时间,你可以突然闯入,看看他们在做什么。 在软件中,this is how you can do that。
小心那些会让你感到困惑的分析师:1)告诉你例行程序的“自我时间”,2)告诉你一个函数被调用了多少次,3)给你一个庞大但几乎无关的图形或表格,或者4)许多有趣但通常不相关的线索,如缓存未命中和线程切换。
找到瓶颈非常容易,因为如果它们很小,它们并不是真正的瓶颈,如果它们很大,那么在它们浪费的时候,它们就在堆栈中,等着你注意。 Here's more on that subject.