编程之美--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);

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

    原文作者:电工小菜鸟
    原文地址: https://blog.csdn.net/jy001227801/article/details/17060961
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞