第一次自己写博客,是将几篇觉得写的好的文章综合起来,应该算是原创吧,大家凑活看
一.利用QueryPerformanceFrequency() 和QueryPerformanceFrequency()组合记录运行时间
使用代码如下:
LARGE_INTEGER data;
LONGLONG f,tb,te;
QueryPerformanceFrequency(&data);
f = data.QuadPart;
QueryPerformanceCounter(&data);
tb = data.QuadPart;
Sleep(1);
QueryPerformanceCounter(&data);
te = data.QuadPart;
cout<<(double)((te-tb)*1.0/f);
两个函数都接受一个LARGE_INTEGER 类型的参数,作为返回值
一下是LARGE_INTEGER的结构:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
当使用的系统为32位时,LowPart和HighPart分别表示低32位和高32位,当为64位操作系统时,可以直接使用QuadPart。
QueryPerformanceCounter(&data)是将当前的计数值返回给data,所以在程序中需要在所需要测的运行时间的两头分别加入该函数,得到计数差,记为dcount。
QueryPerformanceFrequency(&data) 将当前的时钟频率返回给data,记为f。
整个的运行时间是 T = (double) dcount *1.0 / f;
二.关于多核处理器的问题
1.书中提到的是用GetProcessorInfo(),我通过翻网页,找的是GetSystemInfo() 函数。
需要参数 _SYSTEM_INFO ,存放系统的具体信息,MSDN有详细讲解:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx
代码如下:
SYSTEM_INFO si;
GetSystemInfo(&si);
cout<<si.dwNumberOfProcessors;
如此即可得到CPU的具体个数。
2.利用SetThreadAffinityMask()可以设置当前线程运行在哪一个核上
DWORD_PTR SetThreadAffinityMask (
HANDLE hThread, // handle to thread
DWORD_PTR dwThreadAffinityMask // thread affinity mask
);
第一参数是线程的句柄,第二个参数是运行在哪一个核上。
SetThreadAffinityMask(GetCurrentThread(),0x01);
是将当前运行线程设置在第一个核上运行