如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够,解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这两个API来实现。

QueryPerformanceCounter 最小分辨率: 1/1193182 秒
API 开销: 1.92761875388667E-05 秒

多个语句执行之前 GetTickCount 或 timeGetTime 记录的更改。实际的循环数因操作系统正在执行的后台任务而异。
另一方面,QueryPerformanceCounter 更改,该值指示在高分辨率的时间中其用途的连续 API 调用之间的值。在这种情况下,分辨率是一个 microsecond 的顺序。因为系统依赖于分辨率,不存在,它测量标准单元。您必须通过确定的秒数经过 QueryPerformanceFrequency 划分不同之处。在上述情况只调用 API 的开销是关于 19 微秒为单位)。这将不得不上进行减法运算.

Code//引用的命名空间
using System.Runtime.InteropServices;
using System.Security;
////////////////////////////
/// <summary>
/// 定义一个高精度的时间类
/// </summary>
public class Timer
{ #region private members
private long ticksPerSecond = 0;
private long elapsedTime = 0;
private long baseTime = 0;
#endregion
#region windows API
/// <summary>
/// 获取时间的精度
/// </summary>
/// <param name="PerformanceFrequency"></param>
/// <returns></returns>
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);
/// <summary>
/// 获取时间计数
/// </summary>
/// <param name="PerformanceCount"></param>
/// <returns></returns>
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
static private extern bool QueryPerformanceCounter(ref long PerformanceCount);
#endregion
#region constructors
/// <summary>
/// new
/// </summary>
public Timer()
{
// Use QueryPerformanceFrequency to get frequency of the timer
if (!QueryPerformanceFrequency(ref ticksPerSecond))
throw new ApplicationException("Timer: Performance Frequency Unavailable");
Reset();
}
#endregion
#region public methods
/// <summary>
/// 重置时间相关计数器
/// </summary>
public void Reset()
{
long time = 0;
QueryPerformanceCounter(ref time);
baseTime = time;
elapsedTime = 0;
}
/// <summary>
/// 获取当前与最近一次 reset 时间差
/// </summary>
/// <returns>The time since last reset.</returns>
public double GetTime()
{
long time = 0;
QueryPerformanceCounter(ref time);
return (double)(time - baseTime) / (double)ticksPerSecond;
}
/// <summary>
/// 获取当前系统的时间 ticks 数
/// </summary>
/// <returns>The current time in seconds.</returns>
public double GetAbsoluteTime()
{
long time = 0;
QueryPerformanceCounter(ref time);
return (double)time / (double)ticksPerSecond;
}
/// <summary>
/// 获取此次与上次调用此方法的两次时间差
/// </summary>
/// <returns>The number of seconds since last call of this function.</returns>
public double GetElapsedTime()
{
long time = 0;
QueryPerformanceCounter(ref time);
double absoluteTime = (double)(time - elapsedTime) / (double)ticksPerSecond;
elapsedTime = time;
return absoluteTime;
}
#endregion
}

调用代码举例:

Timer t = new Timer();

double time = t.GetAbsoluteTime();

t.GetElapsedTime();

t.Reset();

t.GetTime();

////////////////////////////////////////////////////

在某些计算机上,由 QueryPerformanceFrequency 返回的结果将作为 CPU 的时钟速度。在处理器运行速度超过 2.1 GHz 的计算机上,该频率值需要至少 32 位的精度。某些程序将 QueryPerformanceFrequency 的结果用作经过签署的整数值,该值只有 31 位精度并带有符号标志。这些程序在这些较快的 CPU 上无法正确运行。要避免出现此问题,程序必须使用由 QueryPerformanceFrequencyQueryPerformanceCounter 返回的所有64 位。

有关超线程技术的更多信息,请访问下面的 Intel Web 站点:

http://cedar.intel.com/cgi-bin/ids.dll/topic.jsp?catCode=CDN

一个 C# 获取高精度时间类(调用API QueryP*)的更多相关文章

  1. .net平台下获取高精度时间类

    原文:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/d940a15c-0d36-4369-8de0-b07cf3 ...

  2. atitit.获取北京时间CST 功能api总结 O7

    atitit.获取北京时间CST 功能api总结 O7 1. 获取cst时间(北京时间)两布:1.抓取url timtstamp >>format 到cst 1 2. 设置本机时间  se ...

  3. Windows下获取高精度时间注意事项

    Windows下获取高精度时间注意事项 [转贴 AdamWu]   花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...

  4. 获取高精度时间注意事项 (QueryPerformanceCounter , QueryPerformanceFrequency)

    花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊- 曾经据说是处理器的cycle counter,但 ...

  5. Windows下获取高精度时间注意事项 [转贴 AdamWu]

    花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊 - 曾经据说是处理器的cycle counter, ...

  6. [转]JavaSE 8—新的时间和日期API

    为什么我们需要一个新的时间日期API Java开发中一直存在一个问题,JDK提供的时间日期API一直对开发者没有提供良好的支持. 比如,已有的的类(如java.util.Date和SimpleDate ...

  7. Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

     下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...

  8. Java基础进阶:时间类要点摘要,时间Date类实现格式化与解析源码实现详解,LocalDateTime时间类格式化与解析源码实现详解,Period,Duration获取时间间隔与源码实现,程序异常解析与处理方式

    要点摘要 课堂笔记 日期相关 JDK7 日期类-Date 概述 表示一个时间点对象,这个时间点是以1970年1月1日为参考点; 作用 可以通过该类的对象,表示一个时间,并面向对象操作时间; 构造方法 ...

  9. java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

    一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start= ...

随机推荐

  1. UVa 10791 (唯一分解) Minimum Sum LCM

    题意: 输入n,求至少两个正整数,使得这些数的最小公倍数为n且和最小. 分析: 设n的分解式为,很显然单独作为一项,和最小. 这里有两个小技巧: 从2开始不断的除n,直到不能整除为止.这样就省去了素数 ...

  2. [cocos2d-x·解Bug]关于cocos2d-x游戏在android锁屏状态下播放Bgm的解决方法

    最近<宠物联萌>在三星App上发布遇到一个问题:如果用户在锁定屏幕时解锁解到一半时取消解锁,这时用cocos2d-x开发的游戏就会出现游戏Bgm会恢复播放,但手机屏幕仍然是锁屏状态的Bug ...

  3. ffmepg 指定RTSP网络连接模式UDP还是TCP

    AVFormatContext *formatCtx = NULL; formatCtx = avformat_alloc_context(); AVDictionary* options = NUL ...

  4. 【Mysql】命令行

    查看数据库->show databases; 建数据库->create database 数据库名; 建表->use 数据库名;->create table 表名(字段); 查 ...

  5. 【转】.. Android应用内存泄露分析、改善经验总结

    原文网址:http://wetest.qq.com/lab/view/107.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.194 ...

  6. 【转】《APUE》第三章笔记(4)及习题3-2

    原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...

  7. DataSet DataTable操作

    DataSet ds = new DataSet();            DataTable dt = new DataTable("OrderList");          ...

  8. LeetCode题解——String to Integer(atoi)

    题目: 字符串转换为数字. 解法: 这道题的意思是要考虑到,如果有前置的空字符,则跳过:如果超出数字范围,则返回最大/最小整数:如果碰到第一个不能转换的字符,则返回. 代码: class Soluti ...

  9. wuzhicms访问统计实现方法

    实现目标:程序实现了对整站页面pv的统计文件的位置:coreframe/app/content/pv.php代码预览: /** * 总站访问次数统计 */ defined('IN_WZ') or ex ...

  10. 微信公众平台开发 ACCESS TOKEN

    获取access token 返回 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将 ...