C# 六种方式实现精确计时

您所在的位置:网站首页 最精确的计时工具 C# 六种方式实现精确计时

C# 六种方式实现精确计时

2024-06-02 03:19:30| 来源: 网络整理| 查看: 265

-------------------------------------------------------

根据综合网上的一些文章,精确计时主要有以下几种方式

1 调用WIN API中的GetTickCount [DllImport("kernel32")]static extern uint GetTickCount();

从操作系统启动到现在所经过的毫秒数,精度为1毫秒,经简单测试发现其实误差在大约在15ms左右

缺点:返回值是uint,最大值是2的32次方,因此如果服务器连续开机大约49天以后,该方法取得的返回值会归零

用法:

uint s1 = GetTickCount(); Thread.Sleep(2719); Console.WriteLine(GetTickCount() - s1); //单位毫秒 2 调用WIN API中的timeGetTime  推荐 [DllImport("winmm")] static extern uint timeGetTime();

常用于多媒体定时器中,与GetTickCount类似,也是返回操作系统启动到现在所经过的毫秒数,精度为1毫秒。

一般默认的精度不止1毫秒(不同操作系统有所不同),需要调用timeBeginPeriod与timeEndPeriod来设置精度

[DllImport("winmm")] static extern void timeBeginPeriod(int t); [DllImport("winmm")] static extern void timeEndPeriod(int t);

 缺点:与GetTickCount一样,受返回值的最大位数限制。

用法:

timeBeginPeriod(1);uint start = timeGetTime(); Thread.Sleep(2719); Console.WriteLine(timeGetTime() - start); //单位毫秒timeEndPeriod(1);  3 调用.net自带的方法System.Environment.TickCount

获取系统启动后经过的毫秒数。经反编译猜测它可能也是调用的GetTickCount,但是它的返回值是int,而GetTickCount与timeGetTime方法的原型中返回值是DWORD,对应C#中的uint,难道.NET对System.Environment.TickCount另外还做了什么处理么?缺点:与GetTickCount一样,受返回值的最大位数限制。

用法:

int aa = System.Environment.TickCount; Thread.Sleep(2719); Console.WriteLine(System.Environment.TickCount - aa); //单位毫秒

 注:经过测试,发现GetTickCount、System.Environment.TickCount也可以用timeBeginPeriod与timeEndPeriod来设置精度,最高可将精度提高到1毫秒。不知是什么原因?

 4 调用WIN API中的QueryPerformanceCounter [DllImport("kernel32.dll ")] static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);

用于得到高精度计时器(如果存在这样的计时器)的值。微软对这个API解释就是每秒钟某个计数器增长的数值。如果安装的硬件不支持高精度计时器,函数将返回false需要配合另一个API函数QueryPerformanceFrequency。

[DllImport("kernel32")] static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);

 QueryPerformanceFrequency返回硬件支持的高精度计数器的频率,如果安装的硬件不支持高精度计时器,函数将返回false。

用法:

long a = 0; QueryPerformanceFrequency(ref a);long b = 0, c = 0; QueryPerformanceCounter(ref b); Thread.Sleep(2719); QueryPerformanceCounter(ref c); Console.WriteLine((c - b) / (decimal)a); //单位秒

精度为百万分之一秒。而且由于是long型,所以不存在上面几个API位数不够的问题。

缺点:在一篇文章看到,该API在节能模式的时候结果偏慢,超频模式的时候又偏快,而且用电池和接电源的时候效果还不一样(笔记本)原文地址:http://delphi.xcjc.net/viewthread.php?tid=1570未经过超频等测试,如果是真的,那该API出来的结果就可能不准。

 5 使用.net的System.Diagnostics.Stopwatch类    推荐

Stopwatch 在基础计时器机制中对计时器的刻度进行计数,从而测量运行时间。如果安装的硬件和操作系统支持高分辨率性能的计数器,则 Stopwatch 类将使用该计数器来测量运行时间;否则,Stopwatch 类将使用系统计数器来测量运行时间。使用 Frequency 和 IsHighResolution 两个静态字段可以确定实现 Stopwatch 计时的精度和分辨率。

实际上它里面就是将QueryPerformanceCounter、QueryPerformanceFrequency两个WIN API封装了一下,如果硬件支持高精度,就调用QueryPerformanceCounter,如果不支持就用DateTime.Ticks来计算。

用法:

Stopwatch sw = new Stopwatch(); sw.Start(); Thread.Sleep(2719); sw.Stop(); Console.WriteLine(sw.ElapsedTicks / (decimal)Stopwatch.Frequency); 6 使用CPU时间戳进行更高精度计时

原文地址:http://www.chinaunix.net/jh/23/110190.html

该方法的原理我不是很明白,硬件知识太匮乏了。精度是ns

在C#中要用该方法必须先建立一个托管C++项目(因为要内嵌汇编),编译成DLL供c#调用,有点麻烦。

C++代码:

// MLTimerDot.h #pragma once using namespace System; namespace MLTimerDot { //得到计算机启动到现在的时钟周期 unsigned __int64 GetCycleCount(void) { _asm _emit 0x0F _asm _emit 0x31 } //声明 .NET 类 public __gc class MLTimer { public: MLTimer(void) { } //计算时钟周期 UInt64 GetCount(void) { return GetCycleCount(); } }; }

C#调用:

long a = 0; QueryPerformanceFrequency(ref a); MLTimerDot.MLTimer timer = new MLTimerDot.MLTimer();ulong ss= timer.GetCount(); Thread.Sleep(2719); Console.WriteLine((timer.GetCount() - ss) / (decimal)a);

缺点:和QueryPerformanceCounter一样,结果不太稳定。

我的结论:常规应用下timeGetTime完全够用了,将精度调到1毫秒,大部分境况都够用。System.Diagnostics.Stopwatch由于调用方便,也推荐使用

来源:本文转载自https://www.cnblogs.com/jintianhu/archive/2010/09/01/1815031.html,这篇文章前几天发过一次,之所以再次发送,一个是本篇文章的确写的好,其次呢,上次忘了加原文转载地址。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭