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

第一次自己写博客,是将几篇觉得写的好的文章综合起来,应该算是原创吧,大家凑活看

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

     是将当前运行线程设置在第一个核上运行

阅读更多
文章标签: 编程之美
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭