在很多情况下,我们解决同样的一个问题可以用不同的算法。面对如此多的算法我们如何去评判它们之间的优劣?软件工程就有着“时间复杂度”与“空间复杂度”的概念。而随着计算机性能的提高,软件也日益复杂,在很多情况下,时间和空间相比有着更为重要的作用,所以,我们必须在软件设计的过程中对我们的算法在运行效率上作出一些努力以减少解决某一问题的时间开销。
 
如何去评判?课堂上老师教我们使用某些方法去分析代码的运算速度,像O之类的公式被我们广泛的用在考试之中,仅仅从理论上去分析,这个方法的确是正确的,但是,面对一个相对复杂的算法或者说是难以计算的情况,我们就需要用一个计时器去计算代码运行前与运行后的时间差,对于对时间要求不是太精确的程序来说,也许Timer控件就可以满足我们的要求,但是如果面对需要我们精确计算的时间我们该怎么办?这时我们就要自己去写一个计时器来实现。
 
微软是个伟大的公司,他为我们留下了一个又一个的API,而这些API可以为我们实现很多相对难以实现的功能,而这一次我们就需要调用QueryPerformanceCounter()与QueryPerformanceFrequency()这两个函数。这两个来自“Kernel32.dll”为我们准备了与硬件沟通的能力,使我们分别能获取计数器的值以及计数器的频率,而我们利用这个特点就可以写出我们需要的计时器!
 
我们先建立一个C#的DLL项目
然后下面的工作就是写代码
动态连接库建立高精度计时器_高精度using System;
动态连接库建立高精度计时器_高精度using System.Collections.Generic;
动态连接库建立高精度计时器_高精度using System.Text;
动态连接库建立高精度计时器_高精度using System.Runtime.InteropServices;
动态连接库建立高精度计时器_高精度using System.ComponentModel;
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度namespace HiPerfTimer
动态连接库建立高精度计时器_高精度{
动态连接库建立高精度计时器_高精度        public class HiPerfTimer
动态连接库建立高精度计时器_高精度        {
动态连接库建立高精度计时器_高精度                [DllImport("Kernel32.dll")]
动态连接库建立高精度计时器_高精度                private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                [DllImport("Kernel32.dll")]
动态连接库建立高精度计时器_高精度                private static extern bool QueryPerformanceFrequency(out long lpFrequency);
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                public HiPerfTimer()
动态连接库建立高精度计时器_高精度                {
动态连接库建立高精度计时器_高精度                        this.startTime = 0;
动态连接库建立高精度计时器_高精度                        this.stopTime = 0;
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                        if (QueryPerformanceFrequency(out this.freq) == false)
动态连接库建立高精度计时器_高精度                        {
动态连接库建立高精度计时器_高精度                                throw new Win32Exception();
动态连接库建立高精度计时器_高精度                        }
动态连接库建立高精度计时器_高精度                }
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                public void Start()
动态连接库建立高精度计时器_高精度                {
动态连接库建立高精度计时器_高精度                        System.Threading.Thread.Sleep(0);
动态连接库建立高精度计时器_高精度                        QueryPerformanceCounter(out this.startTime);
动态连接库建立高精度计时器_高精度                }
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                public void Stop()
动态连接库建立高精度计时器_高精度                {
动态连接库建立高精度计时器_高精度                        QueryPerformanceCounter(out this.stopTime);
动态连接库建立高精度计时器_高精度                }
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                public double Duration
动态连接库建立高精度计时器_高精度                {
动态连接库建立高精度计时器_高精度                        get
动态连接库建立高精度计时器_高精度                        {
动态连接库建立高精度计时器_高精度                                return (double)(this.stopTime - this.startTime) / (double)this.freq;
动态连接库建立高精度计时器_高精度                        }
动态连接库建立高精度计时器_高精度                }
动态连接库建立高精度计时器_高精度                public void Clear()
动态连接库建立高精度计时器_高精度                {
动态连接库建立高精度计时器_高精度                        this.startTime = 0;
动态连接库建立高精度计时器_高精度                        this.stopTime = 0;
动态连接库建立高精度计时器_高精度                }
动态连接库建立高精度计时器_高精度
动态连接库建立高精度计时器_高精度                private long startTime;
动态连接库建立高精度计时器_高精度                private long stopTime;
动态连接库建立高精度计时器_高精度                private long freq;
动态连接库建立高精度计时器_高精度        }
动态连接库建立高精度计时器_高精度}
 
以上就是该计时器的代码,在生成了HiPerfTimer.dll之后我们可将它附加到我们的程序中,C#引用DLL非常方便,没错~就像一个头文件!创建一个HiPerfTimer对象后,通过Start与Stop方法我们就可以控制计时器了,剩下的工作交给Duration来获取计时器的值,误差一般为0.1ms左右,相对来说,精度还是很高了~