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

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

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

(0)

相关推荐

  • c#编写的番茄钟倒计时器代码

    恩  主要大家可以看下思路吧  图形界面里 除了图标和音乐两个资源 别的都是代码. 时间没有用timer组件 是自创的Time类在一个线程中进行的倒计时.  对于导出记录 创建了一个Record类  别的就没什么了  .... Program.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace 番茄钟 {   

  • C#基于TimeSpan实现倒计时效果的方法

    本文实例展示了C#基于TimeSpan实现倒计时效果的方法,比较实用的功能,对于初学者来说有一定的学习参考价值.具体实现方法如下: 示例代码如下: using System; using System.Threading; namespace ConsoleApplication29 { class Program { static void Main(string[] args) { try { DateTime _timeEnd = DateTime.Now.AddSeconds(62);

  • C#使用Shader实现夜幕降临倒计时的效果

    最近火爆全球的PC游戏Battlerite(战争仪式)在倒计时的会生成一种类似夜幕降临的效果,会以战场中心为圆心,某个长度为半径的范围外是暗的,而这个半径会逐渐缩小,而圆之外的阴暗部分是附着地形的,本文就尝试使用屏幕后处理的手段来实现这种效果. (暂时缺少Battlerite的截图,稍后会补上) 首先看效果图: 注:本文参考了Tasharen Fog of War插件 创建一个C#脚本,命名为NightFall.cs,为NightFall类创建一些公共变量(nightColor,center和r

  • C#计算两个时间差的方法代码分享

    一.首先,介绍几个简单的概念.如下: 1.DateTimeDateTime值类型代表了一个从公元0001年1月1日0点0分0秒到公元9999年12月31日23点59分59秒之间的具体日期时刻.因此,你可以用DateTime值类型来描述任何在想象范围之内的时间.一个DateTime值代表了一个具体的时刻 2.TimeSpanTimeSpan值包含了许多属性与方法,用于访问或处理一个TimeSpan值下面的列表涵盖了其中的一部分:Add:与另一个TimeSpan值相加.Days:返回用天数计算的Ti

  • C#中计时器的简单实现方法示例

    本文实例讲述了C#中计时器的简单实现方法.分享给大家供大家参考,具体如下: startTime = DateTime.Now; DispatcherTimer dt = new DispatcherTimer(); dt.Interval = new TimeSpan(0, 0, 1); dt.Tick += new EventHandler(dt_Tick);//调用函数 dt.Start(); void dt_Tick(object sender, EventArgs e) { timeSp

  • C#实现两个时间相减的方法

    本文实例讲述了C#实现两个时间相减的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;    namespace Test  {      class Program      {          static void Main(string[] args)          {          

  • C#结合JavaScript实现秒杀倒计时的方法

    本文实例讲述了C#结合JavaScript实现秒杀倒计时的方法.分享给大家供大家参考.具体如下: 最近做个秒杀活动,要用到倒计时.要求每周三上午10:00开始倒计时 private string Dtime() { byte tempB = (byte)DateTime.Now.DayOfWeek; byte dayByte = (byte)DayOfWeek.Wednesday; DateTime wednesdayNow = DateTime.Now.AddDays(dayByte - te

  • C#短时间内产生大量不重复的随机数

    生成随机数可以用伪随机数发生器Random,受种子控制生成伪随机数,默认以当前时间值为种子.如果程序运行的很快,就会导致在几乎同一时刻运行多次,肯定会有重复的.比如我们要生成1到10之间的5个随机数,则经常会产生 2 2 1 1 1这样的情况,那么如何得到非常随机的不那么重复的随机数呢?比如 4 2 3 3 5这样的. 有人说用Thread.Sleep(5) ,但我不推荐,因为这样会使系统减缓运行. 我采取的方法是:用种子Guid.NewGuid().GetHashCode(),在短时间里不会出

  • C#实现的Win32控制台线程计时器功能示例

    本文实例讲述了C#实现的Win32控制台线程计时器功能.分享给大家供大家参考,具体如下: 在C#中提供了三种类型的计时器: 1.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 2.基于服务器的计时器(System.Timers.Timer) 3.线程计时器(System.Threading.Timer) 一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境

  • js与C#进行时间戳转换

    JS时间戳转成C#里的时间,再把C#里的时间戳转成JS的时间 JS里的时间戳 复制代码 代码如下: var dt = new Date().getTime();//时间戳 C# 时间戳转时间 复制代码 代码如下: DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime( new DateTime(1970, 1, 1));             long lTime = long.Parse(dt + "0000");  //说

  • C#实现windows form倒计时的方法

    本文实例讲述了C#实现windows form倒计时的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace date { public partial cl

随机推荐