您的位置:首页 > 编程语言 > C#

C#实现测量程序运行时间及cpu使用时间

2011-09-13 13:45 656 查看
计算程序运行时间(.net1.1 于.net2.0的区别)在.net2.0中提供了Stopwatch类,简单例子

using System.Diagnostics;

private Stopwatch stw = new Stopwatch();

private void Form1_Load(object sender, EventArgs e)

{

stw.Reset(); //停止时间间隔测量,并将运行时间重置为零。

stw.Start();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

DialogResult dr = MessageBox.Show("真的要退出?", "退出", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (dr == DialogResult.Yes)

{

stw.Stop();

MessageBox.Show("程序共运行时间:" + stw.Elapsed.Seconds.ToString() + "秒");

e.Cancel = false;

}

else

{

e.Cancel = true;

}

}

附录:

无论你是搞技术研究还是搞项目开发,高精度的时间测量在很多场合下都是必需的。xiaotie 在其《dotnet下时间精度测量》提到了一个 QueryPerfCounter,它对目前还在使用 Microsoft .NET Framework v1.1 的开发人员来说的确是一个好帮手。但若你已经用上了 Microsoft .NET Framework v2.0,那么[b]Stopwatch[/b] 将会成为你进行高精度时间测量的不二选择。

1. 测试 [b]Stopwatch[/b]

这里,我借用一下 xiaotie 在《dotnet下时间精度测量》的测试代码,并给出对应的运行结果:

// Code #01

static void Test1()

{

[b]Stopwatch[/b] sw = new [b]Stopwatch[/b]();

sw.Start();

sw.Stop();

Console.WriteLine("[b]Stopwatch[/b] 时间精度:{0}ms", sw.ElapsedMilliseconds);

}

// Output:

//

// [b]Stopwatch[/b] 时间精度:0ms

static void Test2()

{

[b]Stopwatch[/b] sw = new [b]Stopwatch[/b]();

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("[b]Stopwatch[/b] 时间精读异常:{0}ms", sw.ElapsedMilliseconds);

}

}

Console.WriteLine("共进行{0}次 [b]Stopwatch[/b] 的时间精度测试", loop);

Console.WriteLine("其中{0}次 [b]Stopwatch[/b] 的时间精度异常", exCount);

Console.WriteLine("时间校准有效性{0}%", 100 - (100.0 * exCount) / loop);

}

// Output:

//

// 共进行10000次 [b]Stopwatch[/b] 的时间精度测试

// 其中0次 [b]Stopwatch[/b] 的时间精度异常

// 时间校准有效性100%

static void Test3()

{

[b]Stopwatch[/b] sw = new [b]Stopwatch[/b]();

for (int i = 0; i < 200; i++)

{

sw.Reset();

sw.Start();

sw.Stop();

Console.WriteLine("[b]Stopwatch[/b] 时间精度:{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:

//

// [b]Stopwatch[/b] 时间精度:0ms

// 第10次循环,耗时0ms

//

// [b]Stopwatch[/b] 时间精度:0ms

// 第12次循环,耗时0ms

//

// [b]Stopwatch[/b] 时间精度:0ms

// 第16次循环,耗时0ms

从测试结果中可以看到,[b]Stopwatch[/b] 绝对能够满足挑剔的你!怎么样?手痒了吗?

2. 应用 [b]Stopwatch[/b]

[b]Stopwatch[/b] 位于 System.Diagnostics 命名空间中,它的使用方法非常简单,只要你会用一般的计时器,你就会使用它。

2.1 创建实例

你可以通过 new 或者 [b]Stopwatch[/b].StartNew() 来创建一个
[b]Stopwatch
[/b] 实例:

// Code #02

[b]Stopwatch[/b] sw1 = new [b]Stopwatch[/b]();

[b]Stopwatch[/b] sw2 = [b]Stopwatch[/b].StartNew();

使用 StartNew() 会创建一个 [b]Stopwatch[/b] 实例并马上开始计时,即等效于如下代码:

// Code #03

[b]Stopwatch[/b] sw2 = new [b]Stopwatch[/b]();

sw2.Start();

2.2 测量时间

// Code #04

sw1.Start();

// Do something here

sw2.Stop();

long elaspsedMilliseconds = sw1.ElaspedMilliseconds;

2.3 应用示例

微软官方提供了一系列示范程序用于演示 Visual Studio 2005,其中 Basic [b]Class[/b] Library 部分带有一个[b]Stopwatch[/b] 的 Windows Forms 示例程序,你可以到 101 Samples for Visual Studio 2005 下载示例代码。

3. 深入 [b]Stopwatch[/b]

[b]Stopwatch[/b] 内部也调用了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 两个函数,与 QueryPerfCounter 不同的是,当[b]Stopwatch[/b] 检测到当前的系统和硬件不支持高精度的计数器时,它将转用我们所熟悉的 DateTime 做法。

[b]Stopwatch[/b] 在其静态构造器中调用 QueryPerformanceFrequency(),透过该函数的返回值判断当前的系统和硬件是否支持高精度的计数器,并设置 IsHighResolution 属性的值。[b]Stopwatch[/b] 内部用于计算时间间隔的主要方法都会根据 IsHighResolution 的值来选择合适的计算方法。有兴趣的话,你可以使用 Reflector
探究一下 [b]Stopwatch[/b] 的内部。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: