.net平台下获取高精度时间类
前言:.NET 2.0前运行库中不存在高精度的计时器,而您又需要它,解决的方法是通过调用QueryPerformanceFrequency 和 QueryPerformanceCounter这两个Win32 API来实现。在.NET 2.0时,stopwatch类也可实现高精度计时,请参考:《使用Stopwatch类实现高精度计时》
.NET运行库具有一个属性—— System.Environment.Tickcount,您可以使用它计算时间。该属性返回计算机最近一次启动之后,已用时间滴答数(ms)。一开始,您可能觉得它是一个非常好的工具。但是,它有一个相当显著的缺陷,即该属性并不是每毫秒都更新。
该属性的更新频率通常依赖于计时器的分辨率。在该案例中,tick-count属性的分辨率是15 ms。如果您在一个循环中持续访问该属性,则在更新之前的每15ms它返回相同的值,然后在下一次更新之前的另一个15ms中,它返回一个新的值。现代的计算机每秒能够执行非常巨大的计算量,15ms的分辨率将使得您的计算看上去好像“停停动动的”。
警告:
如果希望在应用程序中使用TickCount属性,那么必须明确它返回的是一个无符号整数值。因为该属性是计算机启动之后已用时间的滴答数,所以如果计算机运行了非常长的时间 (例如超过25天),该属性将返回一个负数。如果您没有考虑这种情况,将使得正在使用的公式出错。在更长的一段时间之后,该值将重新归0。
这里您需要的是一个具有更高分辨率的计时器。一个分辨率为1ms的计时器是您非常好的选择。
.NET 2.0前运行库中不存在高精度的计时器,而您又需要它,解决的方法是通过调用QueryPerformanceFrequency 和 QueryPerformanceCounter这两个Win32 API来实现。
- using System;
- using System.Runtime.InteropServices;
- internal sealed class AccurateTimerHelper
- {
- public AccurateTimerHelper()
- {
- TicksPerSecond = this.GetTicksPerSecond();
- this.BaseTime = this.GetTime();
- }
- [DllImport("kernel32.dll", EntryPoint="QueryPerformanceCounter")]
- private static extern int QueryPerformanceCounter(ref long lpPerformanceCount);
- [DllImport("kernel32.dll", EntryPoint="QueryPerformanceFrequency")]
- private static extern int QueryPerformanceFrequency(ref long A_0);
- public long GetElapsedTime()
- {
- return (long)((((double)(this.GetTime() - this.BaseTime)) / ((double)TicksPerSecond)) * 10000);
- }
- private long GetTime()
- {
- long time = 0;
- if (AccurateTimerHelper.QueryPerformanceCounter(ref time) == 0)
- {
- throw new NotSupportedException("Error while querying the high-resolution performance counter.");
- }
- return time;
- }
- private long GetTicksPerSecond()
- {
- long ticksPerSecond = 0;
- if (AccurateTimerHelper.QueryPerformanceFrequency(ref ticksPerSecond) == 0)
- {
- throw new NotSupportedException("Error while querying the performance counter frequency.");
- }
- return ticksPerSecond;
- }
- private long BaseTime
- {
- get
- {
- return baseTime;
- }
- set
- {
- this.baseTime = value;
- }
- }
- private long TicksPerSecond
- {
- get
- {
- return this.ticksPerSecond;
- }
- set
- {
- ticksPerSecond = value;
- }
- }
- private long baseTime;
- private long ticksPerSecond;
- }
调用很简单:
- AccurateTimerHelper atHelper = new AccurateTimerHelper();
- /*
- //进行很多费时操作
- */
- atHelper.GetElapsedTime()
.net平台下获取高精度时间类的更多相关文章
- Windows下获取高精度时间注意事项
Windows下获取高精度时间注意事项 [转贴 AdamWu] 花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...
- 一个 C# 获取高精度时间类(调用API QueryP*)
如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够,解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这 ...
- Windows下获取高精度时间注意事项 [转贴 AdamWu]
花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊 - 曾经据说是处理器的cycle counter, ...
- shell下获取系统时间
shell下获取系统时间的方法直接调用系统变量 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d) 获取昨天时期:`date -d yesterd ...
- linux下获取系统时间 和 时间偏移
获取linux时间 并计算时间偏移 void getSystemTimer(void){#if 0 char *wdate[]={"Sun","Mon",&q ...
- 获取高精度时间注意事项 (QueryPerformanceCounter , QueryPerformanceFrequency)
花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊- 曾经据说是处理器的cycle counter,但 ...
- windows平台下获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
转自http://blog.csdn.net/jhqin/article/details/5548656,如有侵权,请联系本人删除,谢谢!! 头文件:WMI_DeviceQuery.h /* ---- ...
- windows和linux平台下的通用时间测试函数
Time.cpp ////////////////////////////////////////////////////////////////////////////// // Timer.cpp ...
- VUE环境下获取当前时间并格式化--按秒数更新
<el-col :span="8"><div class="grid-content title-time"> {{date}}< ...
随机推荐
- vuejsLearn--- -- 怎么查看、修改、追加数据---->data对象
实例观察的数据对象.可以用一个新的对象替换.实例代理了它的数据对象的属 我们现在对data2添加几项 使用数组push()追加 但是直接这样不能进行数组操作 var data2 = { city: ' ...
- 移动端的传统click事件延迟和点透现象
一.场景描述: 1.A/B两个层上下z轴重叠. 2.上层的A点击后消失或移开.(这一点很重要) 3.B元素本身有默认click事件(如a标签) 或 B绑定了click事件. 在以上情况下,点击A/B重 ...
- mysql和CSV
1.mysql导入和导出数据可以通过mysql命令或者mysqldump来完成.mysqldump可以导入和导出完整的表结构和数据.mysql命令可以导入和导出csv文件. 1.mysql支持导入和导 ...
- sql 中set和select区别
基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET ...
- 【转】SQL Server中的事务与锁
SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂 ...
- A记录、CNAME、MX记录、NS记录
1. A记录(IP指向) 又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器找到相应网页的功能. 说明:指向的目标主机地址类型只能使用IP地址. 2. CNA ...
- linux查看某个进程内存占用情况以及/proc/pid/status解释
以nginx 为例1.toptop -b -n 1 |grep nginx|awk '{print "VIRT:"$5,"RES:"$6,"cpu:& ...
- PAT复杂度_最大子列和问题、最大子列和变种
01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...
- swift基础:第三部分:对第一部分的补充说明
今天是我学习swift的第二天,虽然我和swift的距离有点远,但我相信,我会慢慢的接近这门语言的.好了,我们聊聊昨天晚上的事吧,昨天晚上下班早,回到家时,真是惊喜哈,宿舍那两做好了饭,等我吃饭,想对 ...
- paper 125:NSCT——Nonsubsampled contourlet 变换程序(尺度不变性问题研究)
原文地址:NSCT——Nonsubsampled contourlet 变换程序开发教程1作者:向望大海的鱼 08年,被老板逼得走投无路,xx所得项目看来是实在躲不过去,只好硬着头皮上.开发一款图像处 ...