C#编程之 中的高性能计时器
白羽 2018-07-10 来源 :网络 阅读 1986 评论 0

摘要:本文将带你了解C#编程之 中的高性能计时器,希望本文对大家学C#/.Net有所帮助。





简介

精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。

故而,我们要另外寻找一种方法来精确测量时间。

Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。

第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。

然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。

duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率

需要关于 QueryPerformanceCounter 和 QueryPerformanceFrequency 的更多信息,请参阅 MSDN 文档。

代码

下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数的功能。

using System;using System.Runtime.InteropServices;using System.ComponentModel;using System.Threading;

namespace Win32

{

    internal class HiPerfTimer

    {

        [DllImport("Kernel32.dll")]

        private static extern bool QueryPerformanceCounter(

            out long lpPerformanceCount);

 

        [DllImport("Kernel32.dll")]

        private static extern bool QueryPerformanceFrequency(

            out long lpFrequency);

 

        private long startTime, stopTime;

        private long freq;

 

        // 构造函数

        public HiPerfTimer()

        {

            startTime = 0;

            stopTime  = 0;

 

            if (QueryPerformanceFrequency(out freq) == false)

            {

                // 不支持高性能计数器

                throw new Win32Exception();

            }

        }

 

        // 开始计时器

        public void Start()

        {

            // 来让等待线程工作

            Thread.Sleep(0);

 

            QueryPerformanceCounter(out startTime);

        }

 

        // 停止计时器

        public void Stop()

        {

            QueryPerformanceCounter(out stopTime);

        }

 

        // 返回计时器经过时间(单位:秒)

        public double Duration

        {

            get

            {

                return (double)(stopTime - startTime) / (double) freq;

            }

        }

    }

}

使用这个类很简单。只需要创建一个 HiPerfTimer 的实例,然后调用 Start() 开始计时,Stop() 停止计时。要获得经过的时间,调用 Duration() 函数即可。 

参考下面的例子。

HiPerfTimer pt = new HiPerfTimer();     // 创建新的 HiPerfTimer 对象

pt.Start();                             // 启动计时器

Console.WriteLine("Test\n");            // 需要计时的代码

pt.Stop();                              // 停止计时器

Console.WriteLine("Duration: {0} sec\n",

     pt.Duration); // 打印需要计时部分代码的用时


 

 


以上就介绍了C#.NET的相关知识,希望对C#.NET有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言C#.NET频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved