VC++多线程下内存操作的优化(5)
}
/* wait until all threads are done */
retValue=WaitForMultipleObjects(threadCount,threadHandles
,1,INFINITE);
stopTime=GetTickCount();
printf("Total time elapsed was: %d milliseconds",
stopTime-startTime);
printf(" for %d alloc operations. ",
actData.allocCount*threadCount);
/* cleanup */
for(count=0;count<threadCount;count++)
CloseHandle(threadHandles[count]);
free(threadHandles);
return 0;
}
测试程序在处理完参数后,创建参数1指定数量的线程,threadData结构用于传递计数变量。workThread中进行内存操作,首先初始化随机数发生器,然后进行指定数量的malloc()和free()操作。主线程调用WaitForMultipleObject()等待工作者线程结束,然后输出线程运行的时间。计时不是十分精确,但影响不大。
为了编译这个程序,需要已经安装VC++ v6.0程序,打开一个命令行窗口,键入以下命令:
cl /MT heaptest.c
/MT表示同C运行库的多线程版静态链接。如果要动态链接,用/MD。如果VC++是v5.0的话并且有高版本的msvcrt.dll,应该用动态链接。现在运行这个程序,用性能监视器查看线程切换的次数,然后按上面设置环境参数,重新运行这个程序,再次查看线程切换次数。
当截取这两张图时,测试程序用了60,953ms进行了3,000,000次的内存申请操作,使用的是VC++ v6的堆操作函数。在转换使用HeapAlloc()后,同样的操作仅用了5,291ms。在这个特定的情况下,使用HeapAlloc()使得性能提高了10倍以上!在实际的程序同样可以看到这种性能的提升。
结论
多处理器系统可以自然提升程序的性能,但如果发生多个处理器争用同一个资源,则可能多处理器的系统的性能还不如单处理器系统。对于C/C++程序,问题通常发生在当多个线程进行频繁的内存操作活动时。如上文所述,只要进行很少的一些设置,就可能极大地提高多线程程序在多处理器下的性能。这种方法即不需要源程序,也不需要重新编译可执行文件,而最大的好处是用这种方法得到的性能的提高是不用支付任何费用的。
- 上一篇:BMP位图文件结构及VC操作
- 下一篇:在VC++中访问和修改系统注册表