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)实现的微秒级延时的更多相关文章

  1. windows下基于sublime text3的nodejs环境搭建

    第一步:先安装sublime text3.详细教程可自行百度,这边不具体介绍了. 第二步.安装nodejs插件,有两种方式 第一种方式:直接下载https://github.com/tanepiper ...

  2. Windows下基于http的git服务器搭建-gitstack

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Windows下基于http的git服务器搭建-gitstack     本文地址:http: ...

  3. Windows下基于IIS服务的SSL服务器的配置

    Windows下基于IIS服务的SSL服务器的配置 实验环境 Windows Server 2008 R1(CA) Windows Server 2008 R2(web服务器) Windows 7 x ...

  4. windows下基于IIS配置ssl证书遇到的坑

    前几天配置windows下基于IIS配置ssl证书 完全按照步骤执行 绑定https网址后,一直显示:无法访问此网站 检查了443端口,还有防火墙限制,没发现什么 足足困扰了我好几天 后来突然想到前不 ...

  5. [z]Windows 下基于 Eclipse 的可视化远程 Linux C/C++ 开发环境搭建

    http://blog.csdn.net/lostaway/article/details/8086056 1.简介 Windows 下远程 Linux 开发工具,比较著名的就是 WinGDB 和 M ...

  6. mongoDB在windows下基于配置文件的安装和权限配置方式

    下载mongoDB  http://www.mongodb.org/downloads 根据操作系统,选择需要下载的安装包 添加mongodb 安装目录 将解压的文件夹中内容拷贝,存放在想要安装的文件 ...

  7. 关于windows下基于php7.0.2下编写的第一个扩展

    网上的教程是比较多的,但是基于php7+windows的教程非常之少,通过几天的摸索及参考很多资料,终于发现如下可以运行. php7要求使用vc2015,同时安装sdk,我使用的是8.1的window ...

  8. Windows下基于ADS+J-Link 的ARM开发环境搭建

    在一般ARM编程教学和实验环境里,一般采用 ADS加+并口转Jtag板+H-Jtag的开发环境.但是这种方法最大缺点是需要机器上有一个并口.现在无论PC还是笔记本都很难有并口,因此采用USB接口调试器 ...

  9. Windows下基于python3使用word2vec训练中文维基百科语料(一)

    在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...

随机推荐

  1. 0-2马尔可夫过程Markov Processes

    在0-1中提到了,当最终output的p=0时,这个时候模型无法正常使用,为了解决这个问题,在0-4中会有所提及. 在本节中,其实,计算概率的时候,我们应该假设某一个位置的词与它前面的所有词都是相关的 ...

  2. webBrowser强制在本窗口打开,禁止在新窗口打开

    有时需要用WebBrowser加载URL,来实现某些功能.而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser, ...

  3. vue项目打包之后原本好的样式变得不好了的原因分析

    这个主要是打包的过程将所有的css文件进行归类压缩,导致原先其他文件里的样式对当前的产生了影响,应该有同样的类名了.怎么改?要么改类名,要么用scope,scss的写法.

  4. 汇编 “ program has no starting address ”解决方法

           

  5. react教程 — 性能优化

    参考:https://segmentfault.com/a/1190000007811296?utm_medium=referral&utm_source=tuicool  或  https: ...

  6. [CSP-S模拟测试]:壕游戏(费用流)

    题目传送门(内部题18) 输入格式 第一行包括四个数$n,m,k,s$表示有$n$个剧情点,$m$个关卡,要玩$k$次游戏,$s$个完结点接下来一行包含$s$个数,代表$s$个完结点的编号.接下来$m ...

  7. C# foreach和for比较

    foreach优点: 1.语句更简洁 2.不需要强制类型转换(比如输出的时候要进行一下乘运算) 3.多维数组遍历只需一行代码 4.不用对索引进行检查 缺点: 1.不能对数据进行修改 参考:https: ...

  8. 学会如何使用,pycharm,和gitlanb

    好好看,好好学.这才是正确的. 1  在pycharm 里面选择checkout as  切换分支 2    选择自己提交的,然后选择审核人.是强哥

  9. xshell的安装及连接linux的使用方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...

  10. 关于JS读取DOM对象(标签)的自定义属性

    DOM对象对于js来说,是个很基础的元素,我们写js一般来说,都一定会对它进行操作.我们可以很方便地给它加上自定义的属性,比如: var test = document.getElementById( ...