C#【时间相关篇】实现微秒(Microseconds)级延时
文章目录
- 方法一: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)级延时相关推荐
- stm32实现毫秒ms微秒us级延时
stm32实现毫秒ms微秒us级延时 上一篇文章简单捋了一下32时钟初始化的过程,对systick嘀嗒定时器有了一定的了解吧 实现方法有很多种,推荐一个博客:https://blog.csdn.net ...
- python实现亚毫秒(微秒)级延时
python实现亚毫秒(微秒)级延时 python的常用延时函数为time.sleep,最小延时精度为0.001秒,即time.sleep(0.001)延时为1毫秒,在windows10操作系统下,逻 ...
- STM32 CubeMX如何生成微秒(us)级延时
会自动在tim.c里面生成代码,如下: /* Includes ------------------------------------------------------------------*/ ...
- 无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)
目录 前言 一.代码部分 二.使用和验证 1.引入头文件 2.初始化 3.使用和验证 三.可移植性 总结 前言 接触HAL库差不多两年了,一直苦于HAL库没有自带微秒级的延时,网上的前辈们给出的解决方 ...
- Windows 微秒级 延时
QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时. // 微秒级延时 参数: 微秒 void Control::MySleep(DWORD ...
- 20140627-STM8L101F3P6关于微秒级延时函数不同写法的波形
总结一下STM8L101F3P6工作在16MHz下,利用死循环.中断等不同写法的微秒级延时函数精度的情况. 一.死循环空指令的写法,延时函数程序如下: /*********************** ...
- 痞子衡嵌入式:嵌入式里通用微秒(microseconds)计时函数框架设计与实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现. 在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常 ...
- ms和us级延时函数的实现
ms和us级延时函数的实现 2020 Sept. 8th 用sysTick实现延时 寄存器说明参考火哥(膜拜)的这篇博客:第18章 SysTick-系统定时器 用中断输出: //调用core_cmX. ...
- stm32实现Systick的毫秒级延时和微妙级延时
学习目标: stm32实现Systick的毫秒级延时和微妙级延时 学习内容: 1.Systick 工作原理 Systick(系统定时器)是ARM Cortex M3/M4 内核的一个外设,因为所有的C ...
- 20140627-STM8L101F3P6关于毫秒级延时函数不同写法的波形
总结一下STM8L101F3P6工作在16MHz下,利用死循环.中断等不同写法的微秒级延时函数精度的情况. 一.死循环空指令的写法,延时函数程序如下: /*********************** ...
最新文章
- 微信小程序去掉左上角的返回箭头
- oracle sql profile
- 3.6 判断两个链表是否相交
- Python 知识点笔记一常用数据类型
- ZooKeeper Recipes and Solutions
- Python常用模块之time模块
- Datatables表格数据初始化时回调函数中修改要显示的值
- JZOJ 3886. 【长郡NOIP2014模拟10.22】道路维护
- CSS技巧(含色卡)
- python re findall 效率_python re模块findall()详解
- JDK源码解析之Java.util.Collection
- 干货:用Python玩转数据可视化,炫酷图表是这样做出来的
- 名下房产、汽车、存款被查封后,王思聪要筹拍电影了...
- SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
- python records库_Python Records库使用举例
- [Swift]LeetCode248.对称数 III $ Strobogrammatic Number III
- jquery mini下载_【福利】iPhone 12 Pro Maxamp;mini预售开始啦!
- Linux实战(9):Docker一键搭建kms服务
- 怎么用计算机弹少年这首歌,为什么《少年》这首歌,能火遍全网,它带来了多少收益呢?...
- DenseBox: Unifying Landmark Localization with End to End Object Detection
热门文章
- 通过编程模拟一个简单的饮料自动贩卖机_你喝过自动贩卖的现榨橙汁吗?
- RGB、YUV和HSV颜色空间模型
- 慢慢欣赏linux dsa驱动
- Python+selenium自动化-js处理日历控件(修改readonly属性)
- 外贸客户已读不回怎么办?看了这篇文章就明白了!
- 计算机一级在上网题中怎么新建文本文件,计算机一级上网题教程 计算机基础知识题库...
- GooglePlay 应用内评分测试
- bpm文件大小c语言,BPM 文件扩展名: 它是什么以及如何打开它?
- 机敏问答[复变][3] #20210626
- 移动开发之百度地图导航及定位