欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#计算代码执行时间的方法

程序员文章站 2023-12-05 21:09:34
最近遇到一个模块其执行时间非常短,但是调用频率非常高。精确计算其运算时间对于提高程序整体效率来说非常重要。 在我刚刚接触.net时,也曾经想要测试一下自己写的程序的运行时...

最近遇到一个模块其执行时间非常短,但是调用频率非常高。精确计算其运算时间对于提高程序整体效率来说非常重要。

在我刚刚接触.net时,也曾经想要测试一下自己写的程序的运行时间,当时我使用的是将两个datetime.now相减的笨方法,呵呵。后来知道使用environment.tickcount,对于一般的测试来说就足够了。但是它对于高精度测试就没什么办法,经常是返回个0了事。对于高精度测试我们应当使用queryperformancefrequency函数和queryperformancecounter函数。通过它们可以获得比environment.tickcount更高的精确度。实际上environment.tickcount就是在调用queryperformancefrequency函数和queryperformancecounter函数。

下面是我使用的代码:

复制代码 代码如下:

using system;

class class1
{
 [system.runtime.interopservices.dllimport ("kernel32.dll")]
 static extern bool queryperformancecounter(ref long count);

 [system.runtime.interopservices.dllimport ("kernel32.dll")]
 static extern bool queryperformancefrequency(ref long count);

 [stathread]
 static void main(string[] args)
 {
 long count = 0;
 long count1 = 0;
 long freq = 0;
 double result = 0;

 queryperformancefrequency(ref freq);
 queryperformancecounter(ref count);

 //需要测试的模块

 queryperformancecounter(ref count1);
 count = count1-count;
 result = (double)(count)/(double)freq;

 console.writeline("耗时: {0} 秒", result);
 console.readline();
 }
}

这样能够得到非常精确的结果。但是模块每次运行的时间总会有些误差,而当计算非常精确的时候,这些运行时间的误差也显得比较明显了。为此我对其进行循环多次测试使其误差平均化,通过多次测试的结果来进行执行效率的分析。

复制代码 代码如下:

using system;

class class1
{
 [system.runtime.interopservices.dllimport ("kernel32.dll")]
 static extern bool queryperformancecounter(ref long count);

 [system.runtime.interopservices.dllimport ("kernel32.dll")]
 static extern bool queryperformancefrequency(ref long count);

 [stathread]
 static void main(string[] args)
 {
 long count = 0;
 long count1 = 0;
 long freq = 0;
 double result = 0;

 queryperformancefrequency(ref freq);
 queryperformancecounter(ref count);

 //开始的时候没有这层循环,所得数据浮动很大,添加这层循环来使得结果更加平均
 for (int i=0; i<500; i++)
 {
 //需要测试的模块
 }

 queryperformancecounter(ref count1);

 count = count1-count;
 result = (double)(count)/(double)freq;

 console.writeline("耗时: {0} 秒", result);
 console.readline();
 }
}

c#中的秒表 计算程序运行了多长时间 system.diagnostics.stopwatch

复制代码 代码如下:

private void button1_click(object sender, eventargs e)
{
stopwatch mywatch = new stopwatch();
mywatch.start();
for (int i = 0; i < 1000; i++)
{
console.writeline("just test" + i);
}
mywatch.stop();
long myusetime = mywatch.elapsedmilliseconds;
messagebox.show("執行時間: " + myusetime.tostring() + " ms");
}