(转)C#精确时间计时器
原文地址:http://blog.sina.com.cn/s/blog_699d3f1b01012vgb.html
1 调用WIN API中的GetTickCount
[DllImport("kernel32")]
static extern uint GetTickCount();
从操作系统启动到现在所经过的毫秒数,精度为1毫秒,经简单测试发现其实误差在大约在15ms左右
缺点:返回值是uint,最大值是2的32次方,因此如果服务器连续开机大约49天以后,该方法取得的返回值会归零
用法:
1
2
3
|
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一样,受返回值的最大位数限制。
用法:
1
2
3
4
5
|
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一样,受返回值的最大位数限制。
用法:
1
2
3
|
|
注:经过测试,发现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。
用法:
1
2
3
4
5
6
7
|
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 用 DateTime.Now.Ticks
http://www.cnblogs.com/csharp4/archive/2010/07/24/1784094.html
1个 tick 代表100纳秒,1毫秒等于10000个ticks,也就是说,1秒等于 1E7 个ticks。
任何一个 DateTime 型变量中都有一个 ticks 属性,它代表从 12:00:00 midnight, January 1, 0001 到当前时间值的间隔的 ticks 值。
用上面的方法,最精确,应该也就是精确到1tick,即100纳秒。
(转)C#精确时间计时器的更多相关文章
- linux 下的clock_gettime() 获取精确时间函数
#include <time.h> int clock_gettime(clockid_t clk_id, struct timespec* tp); clock_gettime() 函数 ...
- Android平台之不预览获取照相机预览数据帧及精确时间截
在android平台上要获取预览数据帧是一件极其容易的事儿,但要获取每帧数据对应的时间截并不那么容易,网络上关于这方面的资料也比较少.之所以要获取时间截,是因为某些情况下需要加入精确时间轴才能解决问题 ...
- VC获取精确时间的做法
声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法.非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出. 对关注性能的 ...
- iOS中精确时间的获取
下面是一段无法查证出处的英文和自己的翻译 A quick and easy way to measure the performance of a piece of iOS code is to di ...
- C# Stopwatch类_性能_时间计时器
在研究性能的时候,完全可以使用Stopwatch计时器计算一项技术的效率.但是有时想知道某想技术的性能的时候,又常常想不起可以运用Stopwatch这个东西,太可悲了. 属性: Elapsed 获取当 ...
- 浅析libuv源码-获取精确时间
在Timer模块中有提到,libuv控制着延迟事件的触发,那么必须想办法精确控制时间. 如果是JS,获取当前时间可以直接通过Date.now()得到一个时间戳,然后将两段时间戳相减得到时间差.一般情况 ...
- FFmpeg精确时间截取视频
简介: 之前用到过FFmpeg截取过音频和视频发现,截取的视频文件时间不是很准确,今天便系统的学习了一下FFmpeg截取视频的知识 参考: https://zhuanlan.zhihu.com/p/2 ...
- 2、创建MFC应用程序——基于对话框,时间计时器
使用计时器更新MFC界面时间,频率1s. 文件——新建项目——MFC应用程序,下一步,选择基于对话框,其他默认,完成. 双击窗体(或者鼠标右键)进入类向导,自动创建Ontimer()函数 void C ...
- C# StopWatch程序性能_时间计时器
StopWatch 时间计数器简介: Stopwatch 可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用S ...
随机推荐
- 目录操作工具类 CopyDir.java
package com.util; import java.io.*; /** * 1,建立目的目录. 2,遍历源目录. 3,遍历过程中,创建文件或者文件夹. 原理:其实就是改变了源文件或者目录的目录 ...
- DW(三):polybase基本理论
PolyBase is a technology that accesses and combines(整合) both non-relational and relational data, all ...
- Git基本命令
获取master: git clone ssh://some.i.p/some/source/~/somerep 获取branch: git clone -b branch-version ssh:/ ...
- 解决每次打开office 2010显示正在配置的问题
解决每次打开office 2010显示正在配置的问题 OFFICE 2010 MSDN版出来后,下载安装 ,启动后发现每次打开都会出现“正在配置”的进度,删除重装亦不成功,对SETUP.EXE改名也不 ...
- MySql服务基础
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 ...
- js实现windows扫雷(jquery)
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- find_in_set mysql
有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文, type中以 1,3,4的格式存 ...
- 【Linux】系统 之 Load
一.查看系统负荷 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行).你在终端窗口键入uptime,系统会返回一行信息.这行信息的后半部分,显示"load ave ...
- scala高级内容(一) Case Class
一. 操作符 自定义操作符 操作付默认左结合调用.除了以:结尾的操作符是右结合调用 object OperaterTest extends App{ val a: myInt = new myInt( ...
- [Bug-IOS] - linker command failed with exit code 1 (use -v to see invocation)
Ld /Users/Rubert/Library/Developer/Xcode/DerivedData/OC_Language-emftyzftyvhdpuaxipddjmpnpvox/Build/ ...