文章目录

  • 方法一:System.Diagnostics.Stopwatch【相对方法二精度更高,也更稳定些】
  • 方法二:调用WIN API中的QueryPerformanceCounter
    • 1、延时5us时,精度很差
    • 2、延时500us时,精度高些
      • 500us延时下,进一步研究:
      • 结论:【500us的延时,相对来说还是很准的】
  • 方法三:DateTime.Ticks【延时效果最差】

方法一:System.Diagnostics.Stopwatch【相对方法二精度更高,也更稳定些】

using System;namespace ConsoleApp1
{class Program{static void Main(string[] args){for (int i = 0; i < 20; i++){double result = delayUs(0.005);//延时0.005ms,即5usConsole.WriteLine(result);}Console.ReadLine();}/// <summary>///  微秒延时/// </summary>/// <param name="time">延时时间,单位:ms</param>/// <returns></returns>public static double delayUs(double time){System.Diagnostics.Stopwatch stopTime = new System.Diagnostics.Stopwatch();stopTime.Start();while (stopTime.Elapsed.TotalMilliseconds < time) { }stopTime.Stop();return stopTime.Elapsed.TotalMilliseconds;}}
}

运行结果:【我又测试了1000次,后边基本可以稳定在0.005(还是比较稳的)】

方法二:调用WIN API中的QueryPerformanceCounter

1、延时5us时,精度很差

using System;
using System.Runtime.InteropServices;namespace ConsoleApp1
{class Program{static void Main(string[] args){System.Diagnostics.Stopwatch stopTime = new System.Diagnostics.Stopwatch();stopTime.Start();for (int i = 0; i < 20; i++){delayUs(5);//延时即5us,0.005msConsole.WriteLine(stopTime.Elapsed.TotalMilliseconds);}Console.WriteLine("测试结束");Console.ReadLine();}[DllImport("kernel32.dll")]extern static short QueryPerformanceCounter(ref long x);[DllImport("kernel32.dll")]extern static short QueryPerformanceFrequency(ref long x);/// <summary>/// 微秒延时/// </summary>/// <param name="delay_Time">延时时间,单位:us</param>public static void delayUs(long delay_Time){long stop_Value = 0;long start_Value = 0;long freq = 0;long n = 0;QueryPerformanceFrequency(ref freq);  //获取CPU频率long count = delay_Time * freq / 1000000;   //这里写成1000000就是微秒,写成1000就是毫秒QueryPerformanceCounter(ref start_Value); //获取初始前值while (n < count) //不能精确判定{QueryPerformanceCounter(ref stop_Value);//获取终止变量值n = stop_Value - start_Value;}}}
}

运行结果【延时5us时】:

2、延时500us时,精度高些


500us延时下,进一步研究:

500us延时下,分别延时1s、2s、4s、5s、10s、20s、40s、60s、120s、240s。测试源码如下:

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;namespace ConsoleApp1
{class Program{static void Main(string[] args){Stopwatch stopTime = new Stopwatch();stopTime.Start();//【01】总用时1sfor (int i = 0; i < 2000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【02】总用时2sstopTime = new Stopwatch();stopTime.Start();          for (int i = 0; i < 4000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【03】总用时3sstopTime = new Stopwatch();stopTime.Start();           for (int i = 0; i < 6000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【04】总用时4sstopTime = new Stopwatch();stopTime.Start();           for (int i = 0; i < 8000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【05】总用时5sstopTime = new Stopwatch();stopTime.Start();           for (int i = 0; i < 10000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【06】总用时10sstopTime = new Stopwatch();stopTime.Start();         for (int i = 0; i < 20000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【07】总用时20sstopTime = new Stopwatch();stopTime.Start();         for (int i = 0; i < 40000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【08】总用时40sstopTime = new Stopwatch();stopTime.Start();       for (int i = 0; i < 80000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【09】总用时60sstopTime = new Stopwatch();stopTime.Start();      for (int i = 0; i < 120000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();//【10】总用时120sstopTime = new Stopwatch();stopTime.Start();       for (int i = 0; i < 240000; i++){delayUs(500);//延时即5us,0.005ms}Console.WriteLine(stopTime.Elapsed.TotalMilliseconds);stopTime.Stop();Console.WriteLine("测试结束");Console.ReadLine();}[DllImport("kernel32.dll")]extern static short QueryPerformanceCounter(ref long x);[DllImport("kernel32.dll")]extern static short QueryPerformanceFrequency(ref long x);/// <summary>/// 微秒延时/// </summary>/// <param name="delay_Time">延时时间,单位:us</param>public static void delayUs(long delay_Time){long stop_Value = 0;long start_Value = 0;long freq = 0;long n = 0;QueryPerformanceFrequency(ref freq);  //获取CPU频率long count = delay_Time * freq / 1000000;   //这里写成1000000就是微秒,写成1000就是毫秒QueryPerformanceCounter(ref start_Value); //获取初始前值while (n < count) //不能精确判定{QueryPerformanceCounter(ref stop_Value);//获取终止变量值n = stop_Value - start_Value;}}}
}

多次运行结果如下:

对于测试结果1进行分析:

  • 跑1min相差50000us,共120000个循环,每个循环(500us)相差0.417us(50000÷120000=0.417)

  • 跑2min相差111000us,共240000个循环,每个循环(500us)相差0.4625us(111000÷240000=0.4625)

结论:【500us的延时,相对来说还是很准的】

方法三:DateTime.Ticks【延时效果最差】

DateTime.Ticks:表示0001 年 1 月 1 日午夜 12:00:00 以来所经历的 100 纳秒数,即Ticks的属性为100纳秒(1Ticks = 0.0001毫秒)。

//延时,单位:微妙uspublic static void delay(long t){long b = DateTime.Now.Ticks / 10;long e = 0; long c = 0; ;do{e = DateTime.Now.Ticks / 10;c = e - b;               }while (c < t);}

C#【时间相关篇】实现微秒(Microseconds)级延时相关推荐

  1. stm32实现毫秒ms微秒us级延时

    stm32实现毫秒ms微秒us级延时 上一篇文章简单捋了一下32时钟初始化的过程,对systick嘀嗒定时器有了一定的了解吧 实现方法有很多种,推荐一个博客:https://blog.csdn.net ...

  2. python实现亚毫秒(微秒)级延时

    python实现亚毫秒(微秒)级延时 python的常用延时函数为time.sleep,最小延时精度为0.001秒,即time.sleep(0.001)延时为1毫秒,在windows10操作系统下,逻 ...

  3. STM32 CubeMX如何生成微秒(us)级延时

    会自动在tim.c里面生成代码,如下: /* Includes ------------------------------------------------------------------*/ ...

  4. 无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)

    目录 前言 一.代码部分 二.使用和验证 1.引入头文件 2.初始化 3.使用和验证 三.可移植性 总结 前言 接触HAL库差不多两年了,一直苦于HAL库没有自带微秒级的延时,网上的前辈们给出的解决方 ...

  5. Windows 微秒级 延时

    QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时. // 微秒级延时 参数: 微秒 void Control::MySleep(DWORD ...

  6. 20140627-STM8L101F3P6关于微秒级延时函数不同写法的波形

    总结一下STM8L101F3P6工作在16MHz下,利用死循环.中断等不同写法的微秒级延时函数精度的情况. 一.死循环空指令的写法,延时函数程序如下: /*********************** ...

  7. 痞子衡嵌入式:嵌入式里通用微秒(microseconds)计时函数框架设计与实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现. 在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常 ...

  8. ms和us级延时函数的实现

    ms和us级延时函数的实现 2020 Sept. 8th 用sysTick实现延时 寄存器说明参考火哥(膜拜)的这篇博客:第18章 SysTick-系统定时器 用中断输出: //调用core_cmX. ...

  9. stm32实现Systick的毫秒级延时和微妙级延时

    学习目标: stm32实现Systick的毫秒级延时和微妙级延时 学习内容: 1.Systick 工作原理 Systick(系统定时器)是ARM Cortex M3/M4 内核的一个外设,因为所有的C ...

  10. 20140627-STM8L101F3P6关于毫秒级延时函数不同写法的波形

    总结一下STM8L101F3P6工作在16MHz下,利用死循环.中断等不同写法的微秒级延时函数精度的情况. 一.死循环空指令的写法,延时函数程序如下: /*********************** ...

最新文章

  1. 微信小程序去掉左上角的返回箭头
  2. oracle sql profile
  3. 3.6 判断两个链表是否相交
  4. Python 知识点笔记一常用数据类型
  5. ZooKeeper Recipes and Solutions
  6. Python常用模块之time模块
  7. Datatables表格数据初始化时回调函数中修改要显示的值
  8. JZOJ 3886. 【长郡NOIP2014模拟10.22】道路维护
  9. CSS技巧(含色卡)
  10. python re findall 效率_python re模块findall()详解
  11. JDK源码解析之Java.util.Collection
  12. 干货:用Python玩转数据可视化,炫酷图表是这样做出来的
  13. 名下房产、汽车、存款被查封后,王思聪要筹拍电影了...
  14. SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
  15. python records库_Python Records库使用举例
  16. [Swift]LeetCode248.对称数 III $ Strobogrammatic Number III
  17. jquery mini下载_【福利】iPhone 12 Pro Maxamp;mini预售开始啦!
  18. Linux实战(9):Docker一键搭建kms服务
  19. 怎么用计算机弹少年这首歌,为什么《少年》这首歌,能火遍全网,它带来了多少收益呢?...
  20. DenseBox: Unifying Landmark Localization with End to End Object Detection

热门文章

  1. 通过编程模拟一个简单的饮料自动贩卖机_你喝过自动贩卖的现榨橙汁吗?
  2. RGB、YUV和HSV颜色空间模型
  3. 慢慢欣赏linux dsa驱动
  4. Python+selenium自动化-js处理日历控件(修改readonly属性)
  5. 外贸客户已读不回怎么办?看了这篇文章就明白了!
  6. 计算机一级在上网题中怎么新建文本文件,计算机一级上网题教程 计算机基础知识题库...
  7. GooglePlay 应用内评分测试
  8. bpm文件大小c语言,BPM 文件扩展名: 它是什么以及如何打开它?
  9. 机敏问答[复变][3] #20210626
  10. 移动开发之百度地图导航及定位