| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5519 人关注过本帖, 3 人收藏
标题:[翻译]C# 中的高性能计时器
只看楼主 加入收藏
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
结帖率:100%
收藏(3)
 问题点数:0 回复次数:7 
[翻译]C# 中的高性能计时器
C# 中的高性能计时器
[奥地利]Daniel Strigl 著  野比 译

来源:http://www.

下载:
源文件
HighPerformanceTimerSource.zip (4.72 KB)


图片附件: 游客没有浏览图片的权限,请 登录注册


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

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

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); // 打印需要计时部分代码的用时


下面的图片是该例子在我系统上的输出。
图片附件: 游客没有浏览图片的权限,请 登录注册


[[it] 本帖最后由 野比 于 2009-3-17 22:32 编辑 [/it]]
搜索更多相关主题的帖子: 计时器 高性能 翻译 
2008-04-26 23:22
shezhenhui1989
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:287
专家分:0
注 册:2008-2-1
收藏
得分:0 
谢谢分享了
2008-04-29 09:18
bleach46
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-4-17
收藏
得分:0 
谢谢!!!!
2008-04-29 09:31
jye123
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-4-2
收藏
得分:0 
谢谢分享!
2008-04-29 10:42
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
很好很不错!

实践、学习、再实践、再学习......
2008-04-29 22:20
快速回复:[翻译]C# 中的高性能计时器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018001 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved