作者:First we try, then we
trust 转自:http://www.cnblogs.com/zhenyulu/articles/25326.htm
无论你是搞技术研究还是搞项目开发,高精度的时间测量在很多场合下都是必需的。xiaotie 在其《dotnet下时间精度测量》提到了一个
QueryPerfCounter,它对目前还在使用 Microsoft .NET Framework v1.1 的开发人员来说的确是一个好帮手。但若你已经用上了
Microsoft .NET Framework v2.0,那么 Stopwatch 将会成为你进行高精度时间测量的不二选择。
1. 测试 Stopwatch
这里,我借用一下 xiaotie 在《dotnet下时间精度测量》的测试代码,并给出对应的运行结果:
// Code #01
static void Test1()
{
Stopwatch sw = new Stopwatch();
sw.Start();
sw.Stop();
Console.WriteLine("Stopwatch 时间精度:{0}ms",
sw.ElapsedMilliseconds);
}
// Output:
//
// Stopwatch 时间精度:0ms
static void Test2()
{
Stopwatch sw = new Stopwatch();
int loop = 10000;
int exCount = 0;
for (int i = 0; i < loop; i++)
{
sw.Reset();
sw.Start();
sw.Stop();
if
(sw.ElapsedMilliseconds != 0)
{
exCount++;
Console.WriteLine("Stopwatch 时间精读异常:{0}ms",
sw.ElapsedMilliseconds);
}
}
Console.WriteLine("共进行{0}次 Stopwatch 的时间精度测试", loop);
Console.WriteLine("其中{0}次 Stopwatch 的时间精度异常", exCount);
Console.WriteLine("时间校准有效性{0}%", 100 - (100.0 * exCount) / loop);
}
// Output:
//
// 共进行10000次 Stopwatch 的时间精度测试
// 其中0次 Stopwatch 的时间精度异常
// 时间校准有效性100%
static void Test3()
{
Stopwatch sw = new Stopwatch();
for (int i = 0; i < 200; i++)
{
sw.Reset();
sw.Start();
sw.Stop();
Console.WriteLine("Stopwatch 时间精度:{0}ms",
sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
int j = 0;
for (j = 0; j < i; j++)
{
int l;
}
sw.Stop();
Console.WriteLine("第{0}次循环,耗时{1}ms", i,
sw.ElapsedMilliseconds);
Console.WriteLine();
}
}
// Partial output:
//
// Stopwatch 时间精度:0ms
// 第10次循环,耗时0ms
//
//
Stopwatch 时间精度:0ms
// 第12次循环,耗时0ms
//
//
Stopwatch 时间精度:0ms
//
第16次循环,耗时0ms
从测试结果中可以看到,Stopwatch 绝对能够满足挑剔的你!怎么样?手痒了吗?
2. 应用 Stopwatch
Stopwatch 位于 System.Diagnostics
命名空间中,它的使用方法非常简单,只要你会用一般的计时器,你就会使用它。
2.1 创建实例
你可以通过 new 或者 Stopwatch.StartNew() 来创建一个 Stopwatch 实例:
// Code #02
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = Stopwatch.StartNew();
使用 StartNew() 会创建一个
Stopwatch 实例并马上开始计时,即等效于如下代码:
// Code #03
Stopwatch sw2 = new Stopwatch();
sw2.Start();
2.2 测量时间
// Code #04
sw1.Start();
// Do something here
sw2.Stop();
long
elaspsedMilliseconds = sw1.ElaspedMilliseconds;
2.3 应用示例
微软官方提供了一系列示范程序用于演示 Visual Studio 2005,其中 Basic Class Library 部分带有一个 Stopwatch 的 Windows Forms 示例程序,你可以到 101 Samples
for Visual Studio 2005 下载示例代码。
3. 深入 Stopwatch
Stopwatch 内部也调用了 QueryPerformanceCounter() 和
QueryPerformanceFrequency() 两个函数,与 QueryPerfCounter 不同的是,当 Stopwatch 检测到当前的系统和硬件不支持高精度的计数器时,它将转用我们所熟悉的
DateTime 做法。
Stopwatch 在其静态构造器中调用
QueryPerformanceFrequency(),透过该函数的返回值判断当前的系统和硬件是否支持高精度的计数器,并设置 IsHighResolution
属性的值。Stopwatch 内部用于计算时间间隔的主要方法都会根据 IsHighResolution
的值来选择合适的计算方法。有兴趣的话,你可以使用 Reflector 探究一下 Stopwatch 的内部。
相关推荐
在我刚刚接触.Net时,也曾经想要测试一下自己写的程序的运行时间,当时我使用的是将两个DateTime.Now相减的笨方法,呵呵。后来知道使用Environment.TickCount,对于一般的测试来说就足够了。但是它对于高精度测试就...
总的来说,“短路计算程序,c#版”是电力工程领域的一个实用工具,它利用C#的特性高效地处理电力网络的短路计算问题,通过导纳矩阵进行电气参数的计算和分析,为电力系统的安全稳定运行提供有力支持。对于学习和研究...
3. **定时器与事件处理**:设定程序运行时间限制需要用到计时器组件,如`System.Timers.Timer`或`System.Windows.Forms.Timer`。当设定的运行时间到达时,触发计时器的`Elapsed`或`Tick`事件,执行终止程序的逻辑。 ...
在C#编程中,"程序互斥运行"是一种常见的需求,它确保了同一时间只有一个实例的程序在运行。这种机制通常被用在那些需要单一实例运行的应用程序中,例如某些设置程序或者数据库管理工具,避免用户无意间打开多个实例...
这个“C#版计算你的计算机运行时长”示例可能包含了一个简单的程序,用于获取并显示Windows操作系统从启动到当前时间的持续时间。让我们深入探讨如何在C#中实现这一功能。 首先,我们需要引入`System.Diagnostics`...
`Stopwatch`是.NET框架提供的一种高性能计时器,它能够提供毫秒、微秒甚至纳秒级别的精度,非常适合用于计算代码片段的运行时间。下面是一个基本的使用示例: ```csharp using System.Diagnostics; public static ...
以下是一些关于如何使用C#获取计算机信息的关键知识点,结合描述中的"视频程序",我们可以推断这里可能涉及的是与系统硬件、软件配置及运行时状态相关的知识。 1. **操作系统信息**: - 使用`System.Environment`...
在实际应用中,"暴雨洪水设计计算程序"的使用者通常包括水利工程师、城市规划师、环境科学家和政策制定者。通过使用这类专业工具,他们可以更科学地评估和应对潜在的洪水风险,从而保障公众安全和基础设施的稳定运行...
在本项目“C#源程序 定时关机时间预约升级版”中,开发者通过C#实现了丰富的实用功能,包括定时关机、时间预约、运行检测以及到期提醒,为用户提供了更加智能的时间管理工具。 首先,让我们详细了解一下定时关机...
Windows API提供了大量的函数,可以访问系统级信息,如系统启动时间和当前运行时间。例如,可以使用`GetTickCount64`或`QueryPerformanceCounter`函数来获取系统启动后的毫秒或高精度时间戳。 在C#中,我们可以使用...
首先,让我们了解C#中的时间管理基础。C#提供了DateTime结构,用于表示日期和时间。但是,当涉及到修改系统时间时,我们需要使用到的是`System.Diagnostics.Process`类和`kernel32.dll`库中的`SetSystemTime`函数。`...
3. **C#编程实践**:在C#中编写备份程序,可以使用控制台应用程序、Windows Forms或WPF作为界面。同时,为了提高效率,可以考虑多线程处理,使用`Task`或`ThreadPool`来并行处理多个文件。此外,错误处理和日志记录...
首先,C#语言是在计算机专业中学习高级程序设计语言课程后的自然延伸。随着微软Windows操作系统的普及,学习如何使用C#语言进行面向对象的Windows程序设计变得尤为重要,它不仅有助于后续课程的学习,如操作系统、...
在C#中,访问注册表通常需要使用`Microsoft.Win32.Registry`命名空间下的类,如`RegistryKey`和`Registry.GetValue()`方法。开发者可以通过指定注册表路径来读取与启动相关的键值,比如`HKEY_LOCAL_MACHINE\SOFTWARE...
在C#中,这将涉及时间戳、时间间隔计算以及定时事件的触发等概念。 综上所述,这段C#源代码很可能包含了一个具有基本计算功能和秒表功能的实用程序,学习者可以通过分析和运行这段代码来深入理解C#编程语言,特别是...
首先,C#中的DateTime结构是用于表示日期和时间的内置类型。它提供了丰富的属性和方法,如Day、Month、Year等,可以方便地获取或设置日期的各种组成部分。为了计算与特定日期的天数差,我们需要使用DateTime结构的...
以下是一个关于如何在C#中获取和理解CPU使用率的详细解释: 首先,你需要引入`System.Diagnostics`命名空间,它包含处理系统诊断和性能计数器的类。在你的C#代码中添加以下引用: ```csharp using System; using ...
首先,我们需要了解C#中的基础概念。C#是一种面向对象的编程语言,由微软开发,主要用于构建Windows应用程序。Windows Forms是.NET Framework的一部分,提供了一个用于创建桌面应用的UI(用户界面)框架。 在C#中...
本资源主要关注C#中的面向对象程序设计(OOP)概念,这对于理解和掌握C#编程至关重要。面向对象编程是一种强大的编程范式,它通过模拟现实世界中的对象和它们之间的关系来组织代码。 首先,我们来看“类”。类是C#...
在C#中,可以通过创建一个NTP客户端来实现时间同步。这通常包括以下步骤: 1. 创建一个UdpClient实例,用于通过UDP协议与NTP服务器通信。 2. 构造一个NTP请求包,填充必要的信息,如传输层协议的版本号、模式...