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

 更新时间:2013年03月21日 11:33:20   作者:  
在一些测试工作时我们需要获得高精度的代码执行时间以比较其效率。

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

在我刚刚接触.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");
}

相关文章

  • C#实现语音视频录制-附demo源码

    C#实现语音视频录制-附demo源码

    在很多语言视频软件系统中,经常有将实时的音频或者是视频录制为文件保存到磁盘空间的需求,本篇给大家讲C#实现语音视频录制-附demo源码,感兴趣的朋友一起来学习吧
    2015-08-08
  • C#实现飞行棋项目

    C#实现飞行棋项目

    这篇文章主要为大家详细介绍了C#实现飞行棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C#装箱和拆箱的原理介绍

    C#装箱和拆箱的原理介绍

    这篇文章介绍了C#装箱和拆箱的原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • c#连接access数据库操作类分享

    c#连接access数据库操作类分享

    本文介绍了c#连接access数据库的方法,可以执行删除、更新、插入等操作,大家参考使用吧
    2014-01-01
  • c#实现sunday算法实例

    c#实现sunday算法实例

    Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符,下面是用C#实现sunday的实例代码,有需要的朋友可以参考一下
    2013-08-08
  • WPF实现窗体中的悬浮按钮

    WPF实现窗体中的悬浮按钮

    这篇文章主要为大家详细介绍了WPF实现窗体中的悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 分享WCF聊天程序--WCFChat实现代码

    分享WCF聊天程序--WCFChat实现代码

    无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了测试和部分修改,感觉还不错,分享给大家
    2015-11-11
  • .NET中的Timer类型用法详解

    .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下
    2014-08-08
  • c# 以二进制读取文本文件

    c# 以二进制读取文本文件

    在当前目录创建一个文件myfile.txt,对该文件具有读写权限
    2009-07-07
  • 关于c#中单例模式的一些问题

    关于c#中单例模式的一些问题

    这篇文章主要给大家介绍了关于c#中单例模式的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论