Windows中的PostMessage和SendMessage造成的程序性能低下

今天开始要处理大数据,大约有百G的地理道路数据文件,按照网格来切分生成地图数据。

普通情况下:

(1)单机运行时间太长,性能低
(2)内存不够

(3)本身算法是否可以改进

(4)C++程序写的性能问题,使用的是MFC框架,大量CString对象构建;频繁的 new/delete过程;多线程(对于纯计算类,多线程意义不大,多核并行似乎更合适)

-----------------------------------------------------

今天,发现,sendmessage在多线程中比postmessage耗时不在一个数量级上!去掉,就能提搞20%的性能.

PostMessage和SendMessage的区别:

PostMessage一个属于异步消息,并不等待消息处理,直接返回继续处理;因此,当多线程时,要比SendMessage快,SendMessage需要2次线程切换,才能继续,因此同步开销很大

另外,PostMessage的参数,必须注意到:

不是立即释放的局部变量,否则,当消息处理时,LPARAM指针指向的内容可能已经不存在或者发生改变。

CHAR szText[100]

PostMessage(XXX,NULL,szText);

--------------------------------------

当消息出来时,这个szText所在的函数已经指向完,其空间已经被回收了,因此,指向了一个不可访问的区域。

当PostMessage发送消息,比处理消息快时,还需要注意消息队列长度:

Windows   2000/XP:   There   is   a   limit   of   10,000   posted   messages   per   message   queue.   This   limit   should   be   sufficiently   large.   If   your   application   exceeds   the   limit,   it   should   be   redesigned   to   avoid   consuming   so   many   system   resources.   To   adjust   this   limit,   modify   the   following   registry   key:  

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows   NT
CurrentVersion
Windows
USERPostMessageLimit

The   minimum   acceptable   value   is   4000.

猜你喜欢

转载自lvdccyb.iteye.com/blog/1510740