Win32消息泵与MFC消息映射,哪个更快? C ++

时间:2009-05-25 14:57:07

标签: c++ winapi mfc

不是从易用性,而是从性能的角度来看。 MFC消息映射比典型的消息泵更快吗?

4 个答案:

答案 0 :(得分:6)

MFC包装Win32消息传递,所以如果有什么,MFC会稍微慢一些。也就是说,如果你正在处理UI小部件,性能不是一个问题。

答案 1 :(得分:6)

它们不可能更快,因为它们只是普通Windows消息泵的包装器。话虽如此,它们对反射消息和自定义控件的消息泵封装有很大帮助,而且开销可以忽略不计,所以如果你有一个复杂的UI项目,从长远来看它是值得的。

答案 2 :(得分:4)

我不得不同意(迄今为止)其他2位声称MFC消息泵性能较差的受访者,因为它包含普通的旧C消息泵:MFC使用的技术与包含巨型的简单窗口过程完全不同切换(消息)声明。

MFC消息泵确实依赖于Win32消息循环(必须)。但是实现是非常不同的:基于钩子,调度由MFC内部处理的消息而不是依赖于DispatchMessage()API。

MFC使用map将消息与处理程序进行匹配:O(log n)。从这个角度来看,可能会出现这种情况比大型严重编译的switch(消息)语句更快的情况:O(n)。

此外,识别正确的窗口对象可能比DispatchMessage()更快,我们无法确定这是因为Windows不是开源的。

然而,这是不可能的,特别是考虑额外的代码,例如命令路由,空闲处理和MFC代码处理的各种极端情况......以及编译器足够聪明以有效实现大{{}的事实。 1}}陈述!

话虽如此,15年来的表现并没有被认为是重要的。

答案 3 :(得分:0)

塞尔格写道:

  

MFC消息泵确实依赖   在Win32消息循环(它必须)。   但实施非常   不同:基于钩子,调度   由MFC内部处理的消息   而不是依靠   DispatchMessage()API。

我不确定这是否正确。如果您查看 MFC thrdcore.cpp 文件,您将看到此功能:

  BOOL AFXAPI AfxInternalPumpMessage()
  {
     _AFX_THREAD_STATE *pState = AfxGetThreadState();


     .......... snip ...........


     // process this message
     if (pState->m_msgCur.message != WM_KICKIDLE 
         && !AfxPreTranslateMessage(&(pState->m_msgCur)))
     {
        ::TranslateMessage(&(pState->m_msgCur));
        ::DispatchMessage(&(pState->m_msgCur));
     }
     return TRUE;
  }

此功能由MFC PumpMessage 函数调用,您可以看到它使用Win32 DispatchMessage API,就像任何其他Win32应用程序一样。