In some applications exact time measurement methods are very important.

一些应用程序中精确的时间测量是非常重要的。

The often used Windows API method GetTickCount() retrieves the number of milliseconds that have elapsed since the system was started, but the GetTickCount() function only archieve resolutions of 1ms and on the other side they are very imprecise.

常使用WindowApi方法GetTickCount()提取系统启动后使用的毫秒,但是GetTickCount()方法只检索1ms的精度,另一方面他也是非常不精确的

So, for exact time measurement we should find another method.

因此,为了提取精确的时间,我们需要寻找其他的方法。

High resolution timing is supported in Win32 by the QueryPerformanceCounter() and QueryPerformanceFrequency() API methods.

Win32通过QueryPerformanceCounter()和QueryPerformanceFrequency() API支持高精度的时间

This timer functions has much better resolution than the "standard" millisecond-based timer calls, like the GetTickCount() method.

这个时间函数比标准的毫秒级要精确的多

On the other side there is also a little bit overhead when calling this "unmanaged" API methods from C#, but it's better than using the very imprecise GetTickCount() API function.

也有一些开销用非托管的API方法,但是比使用不精确的GetTickCount() API好的多。

The first call, QueryPerformanceCounter(), queries the actual value of the high-resolution performance counter at any point.

The second function, QueryPerformanceFrequency(), will return the number of counts per second that the high-resolution counter performs.

To retrieve the elapsed time of a code section you have to get the actual value of the high-resolution performance counter immediately before and immediately after the section of code to be timed.

The difference of these values would indicate the counts that elapsed while the code executed.

这些值得变化可以指示代码执行花费的时间。

The elapsed time can be computed then, by dividing this difference by the number of counts per second that the high-resolution counter performs (the frequency of the high-resolution timer).

花费时间就可以计算,通过除以高精度时间的频率

duration = (stop - start) / frequency

For more information about QueryPerformanceCounter and QueryPerformanceFrequency read the documentation on MSDN.

http://www.codeproject.com/Articles/2635/High-Performance-Timer-in-C

WW中的类:

 using System;
using System.Runtime.InteropServices; namespace WorldWind
{
public sealed class PerformanceTimer
{
#region Instance Data public static long TicksPerSecond;
#endregion #region Creation /// <summary>
/// Static class
/// </summary>
private PerformanceTimer()
{
} /// <summary>
/// Static constructor
/// </summary>
static PerformanceTimer()
{
// Read timer frequency
long tickFrequency = ;
if (!QueryPerformanceFrequency(ref tickFrequency))
throw new NotSupportedException("The machine doesn't appear to support high resolution timer.");
TicksPerSecond = tickFrequency; System.Diagnostics.Debug.WriteLine("tickFrequency = " + tickFrequency);
}
#endregion #region High Resolution Timer functions [System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
private static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency); [System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
public static extern bool QueryPerformanceCounter(ref long PerformanceCount); #endregion
}
}

备注:C#可以采用下面方案实现 :

Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。

Stopwatch 类为托管代码内与计时有关的性能计数器的操作提供帮助。 具体说来, Frequency 字段和 GetTimestamp 方法可以用于替换非托管 Win32 APIQueryPerformanceFrequency 和 QueryPerformanceCounter。

[WorldWind学习]18.High-Performance Timer in C#的更多相关文章

  1. 【JS】学习18天Jquery Moblie的总结笔记。

    现在是2013年11月18日1:53分,从1号开始学习JqueryMoblie(简称JQM),这些天遇到的问题,和走的弯路还真不少. 先做个小总结,做了那么多天的一些收获: ●JQM是一个手机网站/轻 ...

  2. ExtJS4.2学习(18)时间控件(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-22/190.html 感谢“束洋洋 ”的付出. 前言 ...

  3. 定时任务调度工作(学习记录 三)timer其他重要函数

    TimerTask的两个重要函数: 1.cancel() 作用: 取消当前TimerTask里的任务 演示: 先在继承了TimerTask的类中添加一个计时器,然后在run方法中合适的位置添加canc ...

  4. 定时任务调度工作(学习记录 二)timer定时函数的用法

    schedule的四种用法: 1.schedule(task,time) 参数: task----所安排的任务 time----执行任务的时间 作用: 在时间等于或超过time的时候执行且仅执行一次t ...

  5. go语言time包的学习(Time,Location,Duration,Timer,Ticker)

    package main;   import (     "time"     "fmt" )   func main() {     //time.Time代 ...

  6. swift 学习- 18 -- 自动引用计数

    // Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...

  7. OpenCV学习(18) 细化算法(6)

    本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示 ...

  8. [WorldWind学习]19.WebDownload

    using System; using System.Diagnostics; using System.Globalization; using System.Net; using System.I ...

  9. (C/C++学习)18.C语言双向链表

    说明:数组提供了连续内存空间的访问和使用,而链表是对内存零碎空间的有效组织和使用.链表又分为单向链表和双向链表,单向链表仅提供了链表的单方向访问,相比之下,双向链表则显得十分方便. 一.单向链表的节点 ...

随机推荐

  1. asp.net基于windows服务实现定时发送邮件的方法

    本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; publi ...

  2. Unity+NGUI性能优化方法总结

    1 资源分离打包与加载 游戏中会有很多地方使用同一份资源.比如,有些界面会共用同一份字体.同一张图集,有些场景会共用同一张贴图,有些会怪物使用同一个Animator,等等.可以在制作游戏安装包时将这些 ...

  3. 自定向下分析Binder 之 Binder Model(1)

    Java层的Binder对象模型: IBinder IBinder是Binder通信机制中的核心部分(Base interface for a remotable object, the core p ...

  4. Java集合----Map集合

    Map Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value Map 中的 key 和 value 都 ...

  5. 京东云擎提供了免费的wordpress一键安装功能了

    1. 京东云擎(http://jae.jd.com)提供了免费的个人博客WordPress一键安装功能了,如下图,给开发者分享福利! 免费的应用,提供了源码,提供了数据库: 我之前把文章发到首页,遭到 ...

  6. Duilib教程-HelloDuilib及DuiDesigner的简单使用

    一.HelloDuilib 1. 首先理解DUILIB显示的一个基本流程,如下图: 在Duilib中,WindowImplBase 这个类代表了图中 “CWndClass”. 所以我们需要做的是: 1 ...

  7. 如何在单片机上使用printf函数(printf)(avr)(stm)(lpc)(单片机)(转)

    摘要:    当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,printf ...

  8. 【PHP】算法: 获取满足给定值的最优组合

    PHP 获取给定值的最优组合 方法 -   (蓝洛提供,博客地址: www.zhaorui.info) <?php ini_set('error_reporting','E_ALL^E_NOTI ...

  9. LeetCode——Search a 2D Matrix II

    Description: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix ...

  10. mysql导出csv文件excel打开后数字用科学计数法显示且低位变0的解决方法

    Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0. Excel打开csv文件时,只要字段值都是数字,它 ...