windows下基于(QPC)实现的微秒级延时
1.为什么会写windows下微秒级延时
在上一篇 实现memcpy()函数及过程总结 中测试memcpy的效率中,测试时间的拷贝效率在微秒级别,需要使用微秒级时间间隔计数。
windows下提供QueryPerformanceCounter(查询高性能计数器),QPC是基于硬件计数器,获取高分辨率时间戳。
参考:Acquiring high-resolution time stamps
应用形式:
LARGE_INTEGER start, end;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency); QueryPerformanceCounter(&start); //运行时间体 QueryPerformanceCounter(&end); //转换时间(us) double(end.QuadPart - start.QuadPart) * 1000000 / Frequency.QuadPart
上面通过API查询高性能计数器,开始tick,结束tick,转换对应时间间隔。
2.基于QPC实现us延时
//timer.c #include "timer.h" static LARGE_INTEGER start;
static LARGE_INTEGER tick;
static LONGLONG SecondTick; double GetMicrosecondTimeInterval(long long StartTick, long long EndTick, long long Frequency)
{
return (double)(EndTick - StartTick) * / Frequency;
} /*
* function:us延时初始化
*
* parameter:无
*
* return value:无
*
*/
void MicrosecondDelayInit(void)
{
LARGE_INTEGER frequence;
QueryPerformanceFrequency(&frequence);
SecondTick = frequence.QuadPart;
} /*
* function:MicrosecondDelay();
* 实现微秒级延时
*
* parameter:
* n:延时的us数
*
* return value:
* 无
*/ void MicrosecondDelay(int n)
{
QueryPerformanceCounter(&start);
double endtick = SecondTick * n/1000000.0 + start.QuadPart;
for(;;)
{
QueryPerformanceCounter(&tick);
if (tick.QuadPart >= endtick)
break;
}
}
//timer.h #pragma once //编译器保证头文件只编译一次 #include <windows.h>
#include <stdio.h> #ifdef __cplusplus
extern "C" {
#endif
double GetMicrosecondTimeInterval(long long StartTick, long long EndTick, long long Frequency);
void MicrosecondDelayInit(void);
void MicrosecondDelay(int n);
#ifdef __cplusplus
}
#endif
3.us延时测试
#include <stdio.h>
#include <Windows.h>
#include"timer.h" int main(void)
{
LARGE_INTEGER Frequency;
LARGE_INTEGER StartingTime, EndingTime; QueryPerformanceFrequency(&Frequency);
MicrosecondDelayInit(); QueryPerformanceCounter(&StartingTime);
MicrosecondDelay();
QueryPerformanceCounter(&EndingTime); printf("延时:%lf\n", GetMicrosecondTimeInterval(StartingTime.QuadPart, EndingTime.QuadPart, Frequency.QuadPart));
system("pause");
return ;
}
测试情况:
1.延时情况能达到us级,多次测试运行,个别情况延时会有出入(出现情况较少)。
分析原因:代码级影响较小,主要运行是在windows下,windows并不是实时操作系统,毕竟windows操作系统时间分辨率只能达到ms级。
延时可以被打断。cpu的频率会在变化,代码执行效率也会有影响。
2.这种延时效果明显好于Sleep的ms级延时。
4.windows下us延时,控制误差
1.硬件上实现us延时(这种情况对于不涉及底层硬件操作的并不现实)
2.既然windows提供给我们QPC(查询高性能计数器 <1us),配合着使用我们自己实现的us级延时。
我们延时前获取StartTick,延时结束后再获取EndTick,转换对应对应时间间隔。QueryPerformanceCounter函数2次消耗时间几乎可以忽略。通过打印我们可以看到us延时数。
大多数运行情况,延时函数效果1us内误差。大于1us延时我们可以剔除,保证1us时间误差。(这种做法是我们需要us级延时做测试时采用,保证后面数据结果在特定延时效果下)
5.总结
us延时常用于测试一些性能时使用。windows并未通过us级的延时函数。QPC是基于查询硬件计数器获取时间间隔,能达到us级别。
windows下基于(QPC)实现的微秒级延时的更多相关文章
- windows下基于sublime text3的nodejs环境搭建
第一步:先安装sublime text3.详细教程可自行百度,这边不具体介绍了. 第二步.安装nodejs插件,有两种方式 第一种方式:直接下载https://github.com/tanepiper ...
- Windows下基于http的git服务器搭建-gitstack
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Windows下基于http的git服务器搭建-gitstack 本文地址:http: ...
- Windows下基于IIS服务的SSL服务器的配置
Windows下基于IIS服务的SSL服务器的配置 实验环境 Windows Server 2008 R1(CA) Windows Server 2008 R2(web服务器) Windows 7 x ...
- windows下基于IIS配置ssl证书遇到的坑
前几天配置windows下基于IIS配置ssl证书 完全按照步骤执行 绑定https网址后,一直显示:无法访问此网站 检查了443端口,还有防火墙限制,没发现什么 足足困扰了我好几天 后来突然想到前不 ...
- [z]Windows 下基于 Eclipse 的可视化远程 Linux C/C++ 开发环境搭建
http://blog.csdn.net/lostaway/article/details/8086056 1.简介 Windows 下远程 Linux 开发工具,比较著名的就是 WinGDB 和 M ...
- mongoDB在windows下基于配置文件的安装和权限配置方式
下载mongoDB http://www.mongodb.org/downloads 根据操作系统,选择需要下载的安装包 添加mongodb 安装目录 将解压的文件夹中内容拷贝,存放在想要安装的文件 ...
- 关于windows下基于php7.0.2下编写的第一个扩展
网上的教程是比较多的,但是基于php7+windows的教程非常之少,通过几天的摸索及参考很多资料,终于发现如下可以运行. php7要求使用vc2015,同时安装sdk,我使用的是8.1的window ...
- Windows下基于ADS+J-Link 的ARM开发环境搭建
在一般ARM编程教学和实验环境里,一般采用 ADS加+并口转Jtag板+H-Jtag的开发环境.但是这种方法最大缺点是需要机器上有一个并口.现在无论PC还是笔记本都很难有并口,因此采用USB接口调试器 ...
- Windows下基于python3使用word2vec训练中文维基百科语料(一)
在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...
随机推荐
- spring cloud学习笔记三 Feign与Ribbon负载均衡的区别
一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...
- 给mysql一百万条数据的表添加索引
直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...
- pythonerror ValueError:invalid literal for int() with base 10: '3.14'
解释:对于int()来说,文本输入‘3.14’这个输入是无效的,原因是int类要求输入数字或者整数字符 解决:a= int(float(value)) 注:int本身是一个类,所以返回的是int类,i ...
- 第一周作业—N42-虚怀若谷
一.Linux发行版描述. Linux发行版主要有三个分支:Slackware.Debian.Redhat: (1) Slackware: SUSE:基于Slackware二次开发的一款Linux,主 ...
- iOS 常用随机数
比如:获取一个随机整数范围在:[0,100)包括0,不包括100 ; 参考:https://www.jianshu.com/p/106475cbd3da
- BZOJ 4883 棋盘上的守卫 解题报告
BZOJ4883 棋盘上的守卫 考虑费用流,但是数据范围太大 考虑 \(i\) 行 \(j\) 列如果被选择,那么要么给 \(i\) 行,要么给 \(j\) 列 把选择 \(i\) 行 \(j\) 列 ...
- 【BZOJ2555】SubString(后缀自动机,LCT)
题意:给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 长度 <= ...
- CF 452E. Three strings(后缀数组+并查集)
传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...
- react教程 — 性能优化
参考:https://segmentfault.com/a/1190000007811296?utm_medium=referral&utm_source=tuicool 或 https: ...
- angularjs radio 默认选中
添加ng-model后checked="checked"失效,可见angularjs也不好,会失效html标准属性 解决:添加ng-checked="1" &l ...