C#-用Stopwatch类进行速度测试

转自:http://space.itpub.net/12639172/viewspace-494055

软件的运行速度必须要在用户可以接受的范围内。通常,改善那些短暂的但频繁使用的例程的速度会大幅度地提高软件的整体速度。ITPUB个人空间 vF5I_i4^XS
  要改善速度,当然首先要能够量度时间。好,那我们考虑一下在跑道上的情况,枪声一响,马上按下秒表开始计时,在选手到达终点那一刻结束计时,这时就可以知道该选手所用的时间了。要开始对下一轮比赛计时前,要先将秒表归零。.NET2.0也提供了这样一个秒表:Stopwatch类,它可以比较精确地测量时间。   ITPUB个人空间-S-M\&T|}5ge&x
   速度测试ITPUB个人空间Q`fxI)LG
    软件的性能和可测性是一个复杂的主题。要确保应用程序能够满足用户的期望,就需要在开发周期内考虑它的性能和可测性。这在设计阶段至关重要,一个糟糕的设计几乎肯定会导致糟糕的用户体验。然而,仅仅有好的设计也不能保证程序能够高效地运行,最终代码的质量同样重要。ITPUB个人空间LU:j+?L
    量度一个运行时间较长的例程相当简单。如果一个过程会持续几分钟,只要一块腕表就可以记录它的时间了。比如一个执行时间为两分钟的过程,10%的改善能够节省12秒,这是很容易去确定的。
1gg*Y?a5?'{|0  而如果要测量一个非常短暂的过程,就要考虑更好的精确性了。比如有一些很小的例程,它们的运行时间可能只有千分之一秒,但会被调用100万次,这样的累积效果就明显了。在.NET framework的先前版本中,需要使用Windows API函数,而在.NET framework 2.0中,微软引入了Stopwatch(它就是我们的秒表)类来简化时间的量度任务。ITPUB个人空间0|.Em:n4f/L5\Y `
    Stopwatch类:
X"rO]yzOX!K0    使用Stopwatch类来量度时间非常简单。跟现实生活中的秒表一样,这个类的对象也能够对计数器进行开始、停止、归零(重置)操作,不过它可比一般的秒表精确多了,它能够精确到微秒(也就是百万分之一秒)。ITPUB个人空间\z:Rj%MPzh*m
    示例代码:ITPUB个人空间*t9HJ@ VG2iQlr
    要演示Stopwatch的使用还是来段代码吧。下面是一个控制台应用程序,它将1到100万之间的所有整数累加:
y${-zF)l~T(s0ITPUB个人空间~`QR)m n'`
ITPUB个人空间_~5GQ1F0SZ
usingSystem;
"QGv9yh0oOn!@0
uB'BD3["}#OXV&z0   
namespaceStopWatchClassITPUB个人空间)Evec\^
    {
?T~.E%vFd&BH0       
classProgramITPUB个人空间U1a*Jxm+r�U-C,r1Qm#{
        {
4pGYl5R wN h0           
staticvoidMain(string[] args)ITPUB个人空间3`{0aU3s)VNd
            {
`#{{F'nc0

1o1Lo*J;bS0A0                longtotal=0;ITPUB个人空间O-{#|y(@Gzoz

TY/oij'r Z4@0               for(inti=1; i<=10000000; i++)
(oe$F4v l0Dh#S0                {ITPUB个人空间+B+y[]�n X�{*qW
                    total
+=i;ITPUB个人空间T8DhH}Bl3dl
                }ITPUB个人空间6YtdgD |
            }
#I_H/QuO#d!r]0        }
o$cwRGdwY^0    }
ITPUB个人空间lP&a7?h;St
   ITPUB个人空间.|_5s Z,n3l5P/D
    添加Stopwatch对象:ITPUB个人空间5g"Qqj:Ho+uG
    Stopwatch类位于System.Diagnostics命名空间。下面是添加对象后的代码:
k}~%_,T8N(F0
dAo8@'Z;m:kD)b v,V0    usingSystem;ITPUB个人空间-xAwe-z^
   
usingSystem.Diagnostics;
N |0mOk ^D av0ITPUB个人空间%q K x7u]g!_ \
   
namespaceStopWatchClass
6n7t`n�G"U*z/D7q0    {ITPUB个人空间|$EH3m^0Q,k7mw�I
       
classProgramITPUB个人空间?$R8E9lD3lCl9L8b
        {
!{~WN#Bop0           
staticvoidMain(string[] args)
9?s \w/]f;f0            {ITPUB个人空间!|9y_FR|B
               Stopwatch timer
=newStopwatch();ITPUB个人空间u;Nw]iK`X
               
longtotal=0;
~2YgTN] ]5X)p1^0
oq;g'?6m+G$?0               
for(inti=1; i<=10000000; i++)ITPUB个人空间/vQT@:P I'd)J
                {
B9m6{B(G2r']2s0                    total
+=i;ITPUB个人空间*YN5G2KL w*C
                }ITPUB个人空间Wwor Z$wn(b
            }
2P/e_^KD$a0        }ITPUB个人空间lr!fAa�wO*o
    }

!x"BX[Zhvu0
y$D"O&{Z.d;t0    控制Stopwatch对象:
S6v.t'c)T hm0   Stopwatch提供了几个方法用以控制Stopwatch对象。Start方法开始一个计时操作,Stop方法停止计时。此时如果第二次使用Start方法,将继续计时,最终的计时结果为两次计时的累加。为避免这种情况,在第二次计时前用Reset方法将对象归零。这三个方法都不需要参数。代码是:
7QO:A X*M+]9n'W/s4u/D0
d/z[Dt5c;B)y#f0    usingSystem;ITPUB个人空间wPM'wN8M
   
usingSystem.Diagnostics;ITPUB个人空间Q9pB@)F$W_6X4YR�z{'ok\

u-@(aF6|0   namespaceStopWatchClass
s\FA(t\L3Ei,P0    {
rN,W's#kqy0n O0       
classProgram
d O$N!A7yM0        {ITPUB个人空间�HxMmE,zJ9X)W b
           
staticvoidMain(string[] args)ITPUB个人空间8Qn;l5L1E#V^8Jc-Ik)`
            {
r }FB5O:kV]s0                Stopwatch timer
=newStopwatch();ITPUB个人空间8f*p/oh4Fb5b
               
longtotal=0;
"VN9I#DW0~'[WIQ fL-tM0ITPUB个人空间%}u;i.I�@u
               timer.Start();
-a3D-c Xyn8w@Y0               
for(inti=1; i<=10000000; i++)
6AtY!A,{0su&f0                {
d1?9~V b@Z7H.xCs0                    total
+=i;
w$K,`RmnF8M0                }ITPUB个人空间0Q3WUXCyP%W
ITPUB个人空间m�xIFv\&l
               timer.Stop();
ITPUB个人空间5_Q4] k3LI7vmf
            }ITPUB个人空间2aSC?KsoU tWS
        }ITPUB个人空间7O)`vduk
    }

1p.h5udM2GJ)s|0ITPUB个人空间$S%o9Qr s
    读取Stopwatch结果:
,p%z!bt"k0    在结束计时后下一步就是读取计时结果了。Stopwatch类提供了以下属性:ITPUB个人空间0f4Z W5B4U$b3Y

yd2dp Y&?*|9`0

  • Elapsed:返回一个TimeSpan对象,表示计时时间间隔;
  • ElapsedMilliseconds:返回计时经过的微秒数,精确度稍差,适合于稍长一点的计时;
  • ElapsedTicks:返回计时经过的计时器刻度(timertick)数。计时器刻度是Stopwatch对象可能的最小量度单位。计时器刻度时间的长度由特定的计算机和操作系统确定。Stopwatch对象的Frequency静态字段的值表示一秒所包含的计时器刻度数。注意它与TimeSpan的Ticks属性所用的时间单位的区别。

    应当根据计时任务的情况选择其中的一个属性。在我们的示例程序中,Elapsed属性提供了需要的精确度,用它来输出经过的微秒数。这也是TimeSpan的最高精确度了。ITPUB个人空间-{9b4m"x'{
    下面是最终的程序代码:ITPUB个人空间ZD EoTc9E!y%c{;h4m

 

$bC \:o+AN.T)^0
c#e eM,Ie{,?0    usingSystem;ITPUB个人空间B8{U8T^]e
   
usingSystem.Diagnostics;ITPUB个人空间3X7EPj-JMf�p

P&u:^8WgNRba0   namespaceStopWatchClass
:ad&W'm.n'm5l0    {ITPUB个人空间~#Dp7u9QErj
       
classProgramITPUB个人空间+w(m_Rp&Q"|
        {
[ fHl!RRNZJ0           
staticvoidMain(string[] args)ITPUB个人空间J W3W+}e V$]
            {
l:?qUmS-o:{AJ0                Stopwatch timer
=newStopwatch();ITPUB个人空间&Z4~1x"RoP
               
longtotal=0;
QKE"e-_h8e;RdX0
,fE?L@2ns\/E)L0                timer.Start();
DE3z\!j)FC r0               
for(inti=1; i<=10000000; i++)ITPUB个人空间0^*V+f+P?*AhK2l&q
                {ITPUB个人空间spF0z_r^C
                    total
+=i;
pz"~�Y/ex0                }ITPUB个人空间|$vC HK+Fr

K{];P.x,U-q7F0                timer.Stop();
!Cws2sG%w0ITPUB个人空间-N(YBi_~7fA(m
               
decimalmicro = timer.Elapsed.Ticks /10m;ITPUB个人空间dsq"zVB.o9p
                Console.WriteLine(
"Execution time was {0:F1} microseconds.", micro);ITPUB个人空间 n'j(^s%cH#?
            }ITPUB个人空间#a"c2kTRK3]D*?p
        }ITPUB个人空间6[p:Xr7_7f#P3X
    }
ITPUB个人空间7v*BdvU\i!y!P:P

你可能感兴趣的:(Stop)