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. 如何改变string中的字符值?

    string本身是不可变的,因此要改变string中字符,需要如下操作: str := “hello world” s := []byte(str) s[] = ‘o’ str = string(s) ...

  2. HTML5 canvas绘制图片

    demo.js window.onload=function() { createcanvas(); drawImage(); } function createcanvas() { var CANV ...

  3. bzoj5049 [Lydsy1709月赛]导航系统 双向bfs

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5049 题解 题面里面满眼的随机.既然数据完全随机,那就是在锻炼选手的乱搞能力啊. 根据一个常用 ...

  4. 【leetcode】44. Wildcard Matching

    题目如下: 解题思路:本题和[leetcode]97. Interleaving String非常相似,同样可以采用动态规划的方法.记dp[i][j] = 1或者0 表示pattern[0:i]是否匹 ...

  5. boost location-dependent times

    1. local_date_time #include <boost/date_time/local_time/local_time.hpp> #include <iostream& ...

  6. 存储系统设计——NVMe SSD性能影响因素一探究竟

    目录1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3. ...

  7. 【HDOJ6599】I Love Palindrome String(PAM,manacher)

    题意:给出一个由小写字母组成的长为n的字符串S,定义他的子串[L,R]为周驿东串当且仅当[L,R]为回文串且[L,(L+R)/2]为回文串 求i=[1,n] 所有长度为i的周驿东串的个数 n<= ...

  8. The Rotation Game

    题目链接 题意:有八种操作棋盘进行移动,使得中间8个数字一样,问·最短移动步数及如何移动. 思路:dfs,因为当中间八个数字中有m个数字不同时,至少需要m次操作,将这个m作为估值.

  9. (转载)解决vmware上安装ubuntu不能联网的问题

    在vmware中安装Ubuntu之后,我们希望基本的功能如上网.传输文件等功能都是可用的,但是经常遇到不能上网的情况.使用笔记本时,我们经常希望能通过无线网卡上网,但是在做嵌入式开发时,我们还希望虚拟 ...

  10. shell 截取变量的字符串

    假设有变量 var=http://www.linuxidc.com/test.htm一 # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符,* ...