精确获取时间:

QueryPerformanceFrequency()

-基本介绍

类型:Win32API

原型:BOOL

QueryPerformanceFrequency(LARGE_INTEGER

*lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

QueryPerformanceFrequency()

-技术特点

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。需包含windows.h头文件。

函数的原形是:

BOOL

QueryPerformanceFrequency(LARGE_INTEGER

*lpFrequency);

BOOL

QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:

typeef

union _ LARGE_INTEGER

{

struct

{

DWORD

LowPart;

LONG

HighPart;

};

LONGLONG

QuadPart;

}

LARGE_INTEGER;

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。

测试Sleep的精确时间:

#include

#include

voidmain()

{

LARGE_INTEGERnFreq;

LARGE_INTEGERnBeginTime;

LARGE_INTEGERnEndTime;

doubletime;

QueryPerformanceFrequency(&nFreq);

QueryPerformanceCounter(&nBeginTime);

Sleep(1000);

QueryPerformanceCounter(&nEndTime);

time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;

printf("%f\n",time);

Sleep(1000);

system("Pause");

}

结果为

0.999982

1.000088

1.000200

等,所以Sleep的精度还是比较低的。

2. rdtsc 汇编

static inline unsigned __int64 GetCycleCount()

{

unsigned int timehi, timelo;

__asm

{

rdtsc

mov timehi, edx;

mov timelo, eax;

}

return ((unsigned __int64)timehi << 32) + (unsigned __int64)timelo;

}

rdtsc这个指令是得到CPU自启动以后的运行周期,

在586以上的CPU上有这个指令将放回的数值,

高位返回到edx,

低位放回到eax,

可以用做随机数的种子可以在一段指令的前后调用rdtsc,计算运行这段指令的时间,

不过这个指令在超线程和多核CPU上用来计算时间不是很准确了。

3. 测试实例(运行环境:VS2012,Win7,i3,2.53GHz)

#include "stdio.h"

#include "windows.h"

static inline unsigned __int64 GetCycleCount()

{

unsigned int timehi, timelo;

__asm

{

rdtsc

mov timehi, edx;

mov timelo, eax;

}

return ((unsigned __int64)timehi << 32) + (unsigned __int64)timelo;

}

int _tmain(int argc, _TCHAR* argv[])

{

//PSO参数定义

float v_in=(float)0.45;

float x_in=(float)1.32;

float pbest=(float)0.68;

float gbest=(float)0.03;

float w=(float)0.7;

float c1=(float)2.0;

float c2=(float)2.0;

float r1=(float)0.35;

float r2=(float)0.72;

float v_out=(float)0.0;

//计时程序参数定义

LARGE_INTEGER nFreq;

LARGE_INTEGER nBeginTime;

LARGE_INTEGER nEndTime;

double time;

printf("CPU Times:\n");

for(int i=0;i<10;i++)

{

QueryPerformanceFrequency(&nFreq);

QueryPerformanceCounter(&nBeginTime);

v_out=w*v_in+c1*r1*(pbest-x_in)+c2*r2*(gbest-x_in);

QueryPerformanceCounter(&nEndTime);

time=(double)1000000000.0*(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;

printf("%f:\t%f\n",v_out,time);

}

printf("CPU Cycles:\n");

for(int i=0;i<10;i++)

{

unsigned __int64 nBeginCycle = GetCycleCount();

v_out=w*v_in+c1*r1*(pbest-x_in)+c2*r2*(gbest-x_in);

unsigned __int64 nEndCycle = GetCycleCount();

unsigned __int64 nCycle = nEndCycle - nBeginCycle;

time=(double)nCycle/2.53;

printf("%f:\t%f\n",v_out,time);

}

return 0;

}

Result:

CPU Times:

-1.990600: 405.210849

-1.990600: 810.421699

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 405.210849

-1.990600: 810.421699

CPU Cycles:

-1.990600: 524.901186

-1.990600: 447.430830

-1.990600: 412.648221

-1.990600: 409.486166

-1.990600: 406.324111

-1.990600: 422.134387

-1.990600: 411.067194

-1.990600: 411.067194

-1.990600: 540.711462

-1.990600: 493.280632

请按任意键继续. . .

c语言怎么自动计时,C语言精确计时方法相关推荐

  1. 编好c语言网上自动评测,C语言程序自动评测系统的设计与实现

    摘要: 随着计算机技术的发展和提高,计算机辅助评价(CAA)已成为当前计算机教育应用的热点研究问题之一.已有的研究成果已能很好的解决客观题测评问题,而主观题的评测问题则仍处于发展阶段.C语言程序设计课 ...

  2. c语言商店自动销售,c语言商店商品管理系统设计报告与源代码.doc

    c语言商店商品管理系统设计报告与源代码.doc 1目录1系统分析21.1课程设计内容21.2系统功能需求分析21.3数据结构设计32系统设计32.1总体设计32.2详细设计42.2.1界面设计42.2 ...

  3. c语言模拟自动饮料机,C语言--小程序--简单模拟ATM机

    原标题:C语言--小程序--简单模拟ATM机 ATM.H #ifndef ATM_h #define ATM_h #include #include #include typedef struct _ ...

  4. c语言模仿自动析构,C语言实现析构器

    按照ISO C的规定,一个进程可以注册多大32个函数,这些函数将由exit自动调用.这些函数被称为"终止处理程序"(exit handler),并调用atexit函数来注册这些函数 ...

  5. 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表

    工具效果如图: 多语言是个非常简单且常用的功能.但是重复工作量大,程序手动把多语言Key配置到多语言表经常会出现错漏,或者几经改版,有些Key已经不用却没有剔除,久而久之造成冗余.这中简单且重复的工作 ...

  6. 单片机0 10秒计时C语言,基于单片机的秒,分,时的精确计时实现

    这个学期接触到了单片机,算是个微处理机,是把计算机的部分功能集成化了的.在生活中随处可见:想厨房用的电磁炉内就集成了单片机的控制,客厅挂的数字万年历也是用单片机实现的!经过了解后,我对此产生了极大的兴 ...

  7. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  8. Wix 安装部署教程(十六) -- 自动生成多语言文件

    Wix 安装部署教程(十六) -- 自动生成多语言文件 原文:Wix 安装部署教程(十六) -- 自动生成多语言文件 因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是 ...

  9. Easystructure教程_C语言源代码自动生成流程图

    目录 Easystructure教程_C语言源代码自动生成流程图 1. 简介 2. 下载 3. 安装 4. 使用 5. 其他软件推荐 5.1 Mermaid 5.2 Code2flow ** Easy ...

  10. c语言打包游戏补丁,C语言实现的系统补丁自动安装工具.doc

    C语言实现的系统补丁自动安装工具 C语言实现的系统补丁自动安装工具 现在重装系统对许多人来说已经不是什么难事了,但蛋疼的是重装后繁琐的补丁安装,或许许多人会说我装一款金山卫士之类的安全辅助软件就可以实 ...

最新文章

  1. Android开发简易教程
  2. 乡村要振兴,快递先进村?
  3. Jfinal 对象列表返回前台json数据
  4. 《netty实战》阅读笔记(2)——Netty 的数据容器ByteBuf
  5. C++数据结构与算法(八) 队列及队列的应用
  6. AIR中使用FCKeditor
  7. [4.14校内训练赛by hzwer]
  8. overflow鼠标拖拽显示_[翻译] 从零开始的 .Net Shell 扩展教程 (四) - Shell 拖拽处理程序
  9. 使用for循环打印出大写字母的ASCII码对照表(c语言实现)
  10. 产品使用报告(产品分析)
  11. C#实现PC与三菱PLC通讯
  12. python分析qq聊天记录
  13. 博士阶段能学到什么硕士学不到的东西
  14. 计算机毕业设计Java河南省农村多元化养老服务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
  15. 以中国南方航空为竞品结构化分析并设计航空购票网页
  16. 绝地求生更新维护限时领取星魂套装
  17. [AHK]通达信联动到同花顺下单
  18. acorr_ljungbox(data, lags = 1)报错:ufunc 'isnan' not supported for the input types, and the inputs cou
  19. 工作笔记——微信支付开发相关知识整理
  20. 记一个跟阿里的朋友喝酒的周末-20211201

热门文章

  1. e人e本t6驱动 android,E人E本T7和E人E本T6的区别
  2. Java计算机毕业设计天津城建大学教室查询预约管理系统源码+系统+数据库+lw文档
  3. 条款51:编写new和delete时需固守常规
  4. 在线将ppt转换成pdf格式的方法
  5. 待办事项清单和提醒软件有哪些 好用的每日待办提醒便签
  6. 大一大二的计算机专业同学应该学习什么?如何学习?
  7. 作业调度算法-先到先服务(FCFS)
  8. Volcano社区v1.6.0版本正式发布
  9. windows系统win10系统文件批量重命名软件名称
  10. 使用Gitolite实现分布式版本控制系统的权限管理