[奥地利]Daniel Strigl 著 Ricky 译
来源:http://www.codeproject.com
[size=large;]简介[/size]
精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。
故而,我们要另外寻找一种方法来精确测量时间。
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。
第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。
然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。
duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率
需要关于 QueryPerformanceCounter 和 QueryPerformanceFrequency 的更多信息,请参阅 MSDN 文档。
[size=large;]代码[/size]
下面的类实现了 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); // 打印需要计时部分代码的用时
测试结果大家自己试试了哦
分享到:
相关推荐
private void btn_send_Click(object sender, EventArgs e) { if (this.cB_Hex.Checked == true) { Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象 BSendTemp[0] = Byte.Parse(this.tb_send.Text);...
总结起来,C#中的高性能计时器通常基于`System.Diagnostics.Stopwatch`类实现,它提供了高精度和低延迟的计时功能,适用于各种性能敏感的应用场景。通过分析提供的源代码,我们可以深入了解其内部工作原理,学习如何...
考虑到计时器的性能,尤其是在长时间或高精度计时的情况下,需要关注计时器的精度、CPU占用率以及是否影响其他重要系统的运行。 通过以上介绍,我们可以看到C#计时器在实现顺时、倒计时、暂停和继续功能时涉及的多...
在本文中,我们将深入探讨如何使用C#语言开发一个秒表计时器。C#是一种广泛应用于Windows桌面应用、游戏开发、Web服务等领域的面向对象的编程语言。它以其强大的功能和简洁的语法深受程序员喜爱。 秒表计时器是一个...
在秒表计时器中,我们主要关注`DateTime.Now`属性,它可以获取当前时间,用于记录开始和结束时间。 3. **Stopwatch类**:C#中的System.Diagnostics命名空间提供了一个Stopwatch类,专门用于高性能的时间测量。秒表...
在这个场景中,"C#魔方计时器"是一个专门为魔方爱好者和竞赛者设计的计时工具,它允许用户精确地测量解决魔方的时间,提升练习效率。计时器的全屏功能类似于CCT(Cube Competition Timer)的效果,提供了一个无干扰...
在上面的代码中,我们首先使用 QueryPerformanceFrequency 函数获取高精度计时器的频率,然后使用 QueryPerformanceCounter 函数测定代码的运行用时。最后,我们使用 Console.WriteLine 函数将结果输出到控制台窗口...
在C#中,我们可以使用System.Diagnostics命名空间下的Stopwatch类来创建高性能的计时器。Stopwatch类提供了开始、停止、重置和获取已流逝时间的方法,非常适合用于秒表功能。但在这个项目中,由于需要动态显示计时,...
【PPT演讲倒计时器V2.2(C# WPF开发)】是一个基于C#编程语言和Windows Presentation Foundation(WPF)框架构建的应用程序,专为在Office或WPS环境中进行演示文稿演讲时提供倒计时功能。这款工具能够帮助用户精确...
在构造函数中检查了高性能计时器是否被系统支持,如果不支持,则抛出异常。`Start()`方法用于启动计时,`Stop()`方法用于停止并记录结束时间,`Duration`属性则返回以秒为单位的经过时间。 需要注意的是,尽管`...
对于高性能的图像操作,例如游戏中的帧率控制,可以调整计时器的间隔时间(`Interval`属性)以控制图像更新的速度。此外,尽量减少不必要的重绘,如只更新变化的部分,以提高效率。 7. **文件读写操作** 在这个...
在C#编程中,计时器(Timer)是一个非常实用的组件,广泛应用于各种需要定时触发事件的场景,如游戏开发、数据轮询、实时监控等。本项目提供了一个可以调节计时速度的小型计时器,使得开发者可以根据实际需求灵活...
首先,我们要了解C#中的计时器(Timer)组件。它是System.Timers命名空间下的一个类,通过定期触发Elapsed事件来实现计时功能。创建一个计时器对象,设置其Interval属性以确定间隔时间(单位为毫秒),然后启动计时...
通过这个C#秒表计时器项目,开发者可以深入学习C#的面向对象编程、事件驱动编程、UI设计以及性能计时。同时,这也是一个很好的练习,能提升对多线程和并发的理解,以及如何在实际应用中合理使用`Stopwatch`类。分享...
在.NET框架中,`System.Diagnostics.Stopwatch`类是用于测量时间间隔的一个强大工具,尤其适合在性能测试或计算中需要高精度计时的情况。本文将详细介绍如何使用C#.NET来利用`Stopwatch`类实现高精度计时,并提供源...
相比之下,Stopwatch类是专为高性能计时设计的,它可以提供纳秒级别的精度,非常适合用于精确计时。 下面是一个使用Stopwatch实现20毫秒间隔的示例: ```csharp using System.Diagnostics; public class ...
4. **高性能计时器**: C#的`Stopwatch`类是为高性能计时设计的,它使用硬件定时器,可以提供纳秒级的精度。秒表程序可能就是基于`Stopwatch`类构建的,因为它能提供比`Timer`组件更精确的计时。 5. **异步编程**: ...
总之,理解和正确使用C#中的定时器是编写可靠和高性能程序的关键。确保使用 `Stop` 方法或设置 `Enabled = false` 来停止定时器,并注意在多线程环境下的线程安全问题。通过熟悉这些概念和技术,你可以更有效地利用...
在C#编程环境中,开发高性能应用时,精确的计时是至关重要的。"微秒和毫秒C#计时器"这个主题关注的是如何在C#中实现比默认`System.Timers.Timer`更高精度的定时器,特别是针对微秒和毫秒级别的时间间隔。`System....
根据提供的文件信息,我们可以深入...综上所述,这段代码提供了一个实用的计时器实现示例,对于希望在C#中进行游戏开发的人来说非常有价值。通过理解和运用这些概念和技术,开发者可以构建更加高效和稳定的游戏应用。