现在的位置: 首页 > 综合 > 正文

测量Win32的SetEvent函数及等待函数WaitForSingleObject的延时数据

2013年10月10日 ⁄ 综合 ⁄ 共 1382字 ⁄ 字号 评论关闭

因为经常用到SetEvent和WaitForSingleObject函数组合,来实现事件触发,觉得非常好用,但一直很好奇,这些函数的执行效率如何?或者说,当执行了一个SetEvent触发,大概需要多长时间,WaitForSingleObject才会响应,因为这些数据在实时性操作时是需要明确回答出的。

测试程序:

// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Test.h"
#include <afxmt.h>
#include <Mmsystem.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;
//链接库
#pragma comment(lib, "Winmm.lib")



int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		//
		//	使用MFC的事件类,才能等待函数循环转起来
		//
		CEvent evt;
		evt.SetEvent();	//默认的是“触发完毕自动清除,需要再次手动触发”

		//
		//	创建一个高精度计时器
		//
		::timeBeginPeriod(1);
		Sleep(100);
		DWORD s = timeGetTime();//开始时间(毫秒级)

		//
		//	循环10个百万
		// 
		for (int i=0; i<10000000; i++)
		{
			WaitForSingleObject((HANDLE)evt, INFINITE);
			//........
			evt.SetEvent();	//如果将该句注释,那么循环就不转了
		}

		//
		//	结束
		//
		DWORD e = ::timeGetTime();//结束时间(毫秒级)
		printf("%d\n", e-s);//



	}

	return nRetCode;
}

① MFC类的CEvent的类成员函数SetEvent只是薄薄的包装了一层Win32的 ::SetEvent函数,也就是两者基本相同;

② 多媒体库下的计时函数,计时精度到毫秒级,是可信的。

在CPU:i5-3210 2.5G+4G内存+WIN7的机器上,上述结果为5443ms,也就是每一次“等待”和“触发”的执行时间为0.54ns左右。也就是这些函数的执行效率相当的高。即因这些函数造成的延时在纳秒级,不必考虑。

抱歉!评论已关闭.