如果一个系统包含高精度性能计数器(HRPC,high-resolution performance counter)则此系统提供高精度定时器。你可以使用API函数QueryPerformanceFrequency来获得HRPC的频率HRPCF,返回值为cps(counts per second)。这个依赖于处理器(processor dependent),在一些处理器中HRPCF的值可能就是处理器时钟周期(the cycle rate of the processor clock),比如我们测试,在3.0GHZ的Pentium4处理器(Windows2000 Professional)上得到HSPCF=,在一个2.8GHZ的Pentium4处理器(Windows XP)上得到HSPCF=,而在一个2.4GHZ的Pentium4处理器(Windows2000 Server)上得到HSPCF= 。

使用另外一个函数QueryPerformanceCounter来获取(retrieve)HRPC的值,QPF和QPC的函数原型分别为:

BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency
);
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);
QPC和QPF函数都在winbase.h中定义。函数中用到的数据类型可以参考如下 typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG
typedef unsigned long DWORD; typedef union union {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
在一段代码的前后调用两次HPC函数,就能知道这段代码执行消耗了多少CPU周期或时间,这对于不同算法的性能测试很有帮助,下面有一个例子来进行演示。另外利用循环也可以实现定时功能。 那么怎么根据得到的两个HRPC计算时间呢?因为知道了HRPCF是表示HRPC的频率,所以就可以知道HRPC数值每增加1所代表的时间: HRPC second per count dHMSecondPerCount = 1.0 / HRPCF ; //spc HRPC millisecond per count dHMMillisecondPerCount = 1.0E3 / HRPCF ; //mspc HRPC microsecond per count dHMMicrosecondPerCount = 1.0E6 / HRPCF ; //uspc 知道这三个值就可以根据两个HRPC差值(difference),即diff=HRPC2-HRPC1,这样就可以计算出两次调用QPC函数经过(elapse)的时间: QueryPerformanceCounter( &HRPC1); //code to be timed QueryPerformanceCounter( &HRPC2); diff=HRPC2-HRPC1; Elapsed second = diff * dHMSecondPerCount ; Elapsed millisecond = diff * dHMMillisecondPerCount ; Elapsed microsecond = diff * dHMMicrosecondPerCount ; 例程如下: /****************************
author:Wandy
time: 2005-11-25
file: demoForHighResolutionTimer.cpp
version:1.0
environment:VS.NET2003 + Windows2000Server
abstract:demo for High-Resolution Timer
*****************************/
#i nclude <windows.h>
#i nclude <stdio.h> void main() { LARGE_INTEGER liFrequency;
LARGE_INTEGER liStart;
LARGE_INTEGER liEnd;
LONGLONG liDiff;//or LARGE_INTEGER diff; double dHMSecondPerCount;//how many second per count
double dHMMillisecondPerCount;//how many millisecond per count
double dHMMicrosecondPerCount;//how many microsecond per count //set the current Process and Thresd to a high priority
DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess());
DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); // Save the performance counter frequency for later use.
if ( !QueryPerformanceFrequency( &liFrequency ) )
printf( "QPF() failed with error %d\n", GetLastError() );
else
printf( "HRPCF: %I64d \n",liFrequency.QuadPart ); //
dHMSecondPerCount = 1.0 / (double)liFrequency.QuadPart;
dHMMillisecondPerCount = 1.0E3 / (double)liFrequency.QuadPart;
dHMMicrosecondPerCount = 1.0E6 / (double)liFrequency.QuadPart;
printf("dHMSecondPerCount: %g spc \n", dHMSecondPerCount);
printf("dHMMillisecondPerCount:%g mspc\n", dHMMillisecondPerCount);
printf("dHMMicrosecondPerCount:%g uspc\n", dHMMicrosecondPerCount); //start
if ( !QueryPerformanceCounter( &liStart ) )
printf( "QPC() failed with error %d\n", GetLastError() );
else
printf( "start HRPC: %I64d \n", liStart.QuadPart ); //code to be timed
Sleep( ); //end
if ( !QueryPerformanceCounter( &liEnd ) )
printf( "QPC() failed with error %d \n", GetLastError() );
else
printf( "end HRPC: %I64d \n", liEnd.QuadPart ); //print diff
liDiff = liEnd.QuadPart - liStart.QuadPart; printf( "HRPC diff:%I64d and ms elapsed: %fms\n", liDiff,(double)liDiff * dHMMillisecondPerCount ); //restore the process and thread priority
SetThreadPriority(GetCurrentThread(), dwOldThreadP);
SetPriorityClass(GetCurrentProcess(), dwOldProcessP); //wait for press any key
getchar();
}
在我的机器上的执行结果为
HRPCF:
dHMSecondPerCount: 2.79365e-007 spc
dHMMillisecondPerCount:0.000279365 mspc
dHMMicrosecondPerCount:0.279365 uspc
start HRPC:
end HRPC:
HRPC diff: and ms elapsed: .153511ms

关于High-Resolution Timer(了解)的更多相关文章

  1. Timer计时不准确的解决方案 每次都重新调整,修正误差

    http://stackoverflow.com/questions/29722838/system-timers-timer-steadily-increasing-the-interval 需要在 ...

  2. 初探linux子系统集之timer子系统(一)

    一般来说要让整个linux系统跑起来,那么一个必须的就是linux的时钟,也就是时间子系统了,这里正好工作需要,那么就研究下linux下的时间子系统了. linux内核必须完成两种主要的定时测量.一个 ...

  3. [WorldWind学习]18.High-Performance Timer in C#

    In some applications exact time measurement methods are very important. 一些应用程序中精确的时间测量是非常重要的. The of ...

  4. windows和linux平台下的通用时间测试函数

    Time.cpp ////////////////////////////////////////////////////////////////////////////// // Timer.cpp ...

  5. grub paramiter & menu.list

    在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...

  6. [转]设置Android手机以使用ARM Streamline进行性能分析(二)

    原文因为arm社区改版访问不到了,原作者鲍方,原文地址,这篇是从google cache里挖出来的,希望能帮到要对cocos2dx优化的各位   Posted by Fang Bao, Leave C ...

  7. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  8. 戴文的Linux内核专题:06配置内核(2)

    转自Linux中国 这一部分我们讲配置内核IRQ子系统.中断请求(IRQ)是硬件发给处理器的一个信号,它暂时停止一个正在运行的程序并允许一个特殊的程序占用CPU运行. 这个目录中的第一个问题属于内核特 ...

  9. net programming guid

    Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ...

  10. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

随机推荐

  1. 重拾C,一天一点点_9-指针与数组

    这一章节很重要,一定要多思考.理解! 指针是一种保存变量地址的变量. 通常的机器 都有一系列连续编号或编址的存储单元.一个字节可存char类型,两相邻字节存储单元可存一个short,依此类推. p = ...

  2. yii在TbGridView的td里面加入相应的下拉选项(转)

    当你需要在一个GridView渲染某一个复杂元素的时候(特别是在这种情况下,这是一个小部件),这就需要你在控制器中调用一个动作.例如你给一个GridView的定义这样的一列: <?php $th ...

  3. Timer wheel etc.

    http://code.google.com/p/hierarchal-wheel-timer/ 最小堆的实现(C 语言版) 最小堆的实现(java) Linux 下定时器的实现方式分析 更快bobh ...

  4. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  5. Java 装箱 拆箱

    Java 自动装箱与拆箱   ??什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象的时候,我 ...

  6. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建

    首先先说一下什么是WIF(Windows Identity Foundation).由于各种历史原因,身份验证和标识的管理一般都比较无规律可循.在软件里加入“身份验证”功能意味着要在你的代码里混进处理 ...

  7. STM32F0_新建软件工程详细过程

    前言 由于ST公司推出比STM32F1性价比更高的F0芯片,现在市面上F0芯片的占有率也非常高.F0芯片属于M0内核,主频48M(当然,可以超频的,但尽量不要超的太多),资源大小可根据项目需求来选型. ...

  8. L2-015. 互评成绩

    学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩.系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩.本题就要求你编写这个互评系统的算分模块. ...

  9. oh-my-zsh配置你的zsh提高shell逼格终极选择

    抱歉,这篇博文推迟发布了,人都是有惰性的...看在这个牛逼闪闪的标题就原谅我吧! 为何这篇文章要归类到 mac 下? 第一个问题,稍后我们说明下. zsh是个什么东东? 第二个问题... 你应该稍微接 ...

  10. PHP 文件操作函数大全

    <?php 读取文件夹: $handler = opendir("c:\");//打开文件夹 while($dir = readdir($handler)){//遍历文件夹 ...