c语言怎么自动计时,C语言精确计时方法
精确获取时间:
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语言精确计时方法相关推荐
- 编好c语言网上自动评测,C语言程序自动评测系统的设计与实现
摘要: 随着计算机技术的发展和提高,计算机辅助评价(CAA)已成为当前计算机教育应用的热点研究问题之一.已有的研究成果已能很好的解决客观题测评问题,而主观题的评测问题则仍处于发展阶段.C语言程序设计课 ...
- c语言商店自动销售,c语言商店商品管理系统设计报告与源代码.doc
c语言商店商品管理系统设计报告与源代码.doc 1目录1系统分析21.1课程设计内容21.2系统功能需求分析21.3数据结构设计32系统设计32.1总体设计32.2详细设计42.2.1界面设计42.2 ...
- c语言模拟自动饮料机,C语言--小程序--简单模拟ATM机
原标题:C语言--小程序--简单模拟ATM机 ATM.H #ifndef ATM_h #define ATM_h #include #include #include typedef struct _ ...
- c语言模仿自动析构,C语言实现析构器
按照ISO C的规定,一个进程可以注册多大32个函数,这些函数将由exit自动调用.这些函数被称为"终止处理程序"(exit handler),并调用atexit函数来注册这些函数 ...
- 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表
工具效果如图: 多语言是个非常简单且常用的功能.但是重复工作量大,程序手动把多语言Key配置到多语言表经常会出现错漏,或者几经改版,有些Key已经不用却没有剔除,久而久之造成冗余.这中简单且重复的工作 ...
- 单片机0 10秒计时C语言,基于单片机的秒,分,时的精确计时实现
这个学期接触到了单片机,算是个微处理机,是把计算机的部分功能集成化了的.在生活中随处可见:想厨房用的电磁炉内就集成了单片机的控制,客厅挂的数字万年历也是用单片机实现的!经过了解后,我对此产生了极大的兴 ...
- keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法
前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...
- Wix 安装部署教程(十六) -- 自动生成多语言文件
Wix 安装部署教程(十六) -- 自动生成多语言文件 原文:Wix 安装部署教程(十六) -- 自动生成多语言文件 因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是 ...
- Easystructure教程_C语言源代码自动生成流程图
目录 Easystructure教程_C语言源代码自动生成流程图 1. 简介 2. 下载 3. 安装 4. 使用 5. 其他软件推荐 5.1 Mermaid 5.2 Code2flow ** Easy ...
- c语言打包游戏补丁,C语言实现的系统补丁自动安装工具.doc
C语言实现的系统补丁自动安装工具 C语言实现的系统补丁自动安装工具 现在重装系统对许多人来说已经不是什么难事了,但蛋疼的是重装后繁琐的补丁安装,或许许多人会说我装一款金山卫士之类的安全辅助软件就可以实 ...
最新文章
- Android开发简易教程
- 乡村要振兴,快递先进村?
- Jfinal 对象列表返回前台json数据
- 《netty实战》阅读笔记(2)——Netty 的数据容器ByteBuf
- C++数据结构与算法(八) 队列及队列的应用
- AIR中使用FCKeditor
- [4.14校内训练赛by hzwer]
- overflow鼠标拖拽显示_[翻译] 从零开始的 .Net Shell 扩展教程 (四) - Shell 拖拽处理程序
- 使用for循环打印出大写字母的ASCII码对照表(c语言实现)
- 产品使用报告(产品分析)
- C#实现PC与三菱PLC通讯
- python分析qq聊天记录
- 博士阶段能学到什么硕士学不到的东西
- 计算机毕业设计Java河南省农村多元化养老服务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
- 以中国南方航空为竞品结构化分析并设计航空购票网页
- 绝地求生更新维护限时领取星魂套装
- [AHK]通达信联动到同花顺下单
- acorr_ljungbox(data, lags = 1)报错:ufunc 'isnan' not supported for the input types, and the inputs cou
- 工作笔记——微信支付开发相关知识整理
- 记一个跟阿里的朋友喝酒的周末-20211201
热门文章
- e人e本t6驱动 android,E人E本T7和E人E本T6的区别
- Java计算机毕业设计天津城建大学教室查询预约管理系统源码+系统+数据库+lw文档
- 条款51:编写new和delete时需固守常规
- 在线将ppt转换成pdf格式的方法
- 待办事项清单和提醒软件有哪些 好用的每日待办提醒便签
- 大一大二的计算机专业同学应该学习什么?如何学习?
- 作业调度算法-先到先服务(FCFS)
- Volcano社区v1.6.0版本正式发布
- windows系统win10系统文件批量重命名软件名称
- 使用Gitolite实现分布式版本控制系统的权限管理