您的位置:首页 > 编程语言

编程之美--CPU占用率问题所提到函数的总结

2013-12-01 22:38 183 查看
第一次自己写博客,是将几篇觉得写的好的文章综合起来,应该算是原创吧,大家凑活看

一.利用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);

是将当前运行线程设置在第一个核上运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: