用Stopwatch類來測試你的程式執行時間

2021-05-07 20:06:57 字數 2406 閱讀 3969

上個月在專案中,由於我做的網頁後台計算步驟多,執行時間長,成了棘手問題,如此一來就要優化效能,找出瓶頸,重構**

同事當時的建議是使用時間戳(timespan),後來乙個同事用的是診斷模式裡面乙個計時方法,現在看來都很彆扭,因為要

把時間減來減去,感覺不方便,不好用.今天我偶然的發現了stopwatch這個寶貝,不錯,這個類是在.net 2.0的時候才加入的

看來微軟想的挺周到,這個類就是專門為了對付這種情況來使用的工具,並且它還有乙個非常不錯的功能,可以重新歸零再計時

.下面是**的內容.

軟體的執行速度必須要在使用者可以接受的範圍內。通常,改善那些短暫的但頻繁使用的例程的速度會大幅度地提高軟體的整體速度。

要改善速度,當然首先要能夠量度時間。好,那我們考慮一下在跑道上的情況,槍聲一響,馬上按下秒錶開始計時,在選手到達終點那一刻結束計時,這時就可以知 道該選手所用的時間了。要開始對下一輪比賽計時前,要先將秒錶歸零。.net2.0也提供了這樣乙個秒錶:stopwatch類,它可以比較精確地測量時 間。

速度測試:

軟體的效能和可測性是乙個複雜的主題。要確保應用程式能夠滿足使用者的期望,就需要在開發周期內考慮它的效能和可測性。這在設計階段至關重要,乙個糟糕的設 計幾乎肯定會導致糟糕的使用者體驗。然而,僅僅有好的設計也不能保證程式能夠高效地執行,最終**的質量同樣重要。

量度乙個執行時間較長的例程相當簡單。如果乙個過程會持續幾分鐘,只要一塊腕表就可以記錄它的時間了。比如乙個執行時間為兩分鐘的過程,10%的改善能夠節省12秒,這是很容易去確定的。

而如果要測量乙個非常短暫的過程,就要考慮更好的精確性了。比如有一些很小的例程,它們的執行時間可能只有千分之一秒,但會被呼叫100萬次,這樣的累積 效果就明顯了。在.net framework的先前版本中,需要使用windows api函式,而在.net framework 2.0中,微軟引入了stopwatch(它就是我們的秒錶)類來簡化時間的量度任務。

stopwatch類:

使用stopwatch類來量度時間非常簡單。跟現實生活中的秒錶一樣,這個類的物件也能夠對計數器進行開始、停止、歸零(重置)操作,不過它可比一般的秒錶精確多了,它能夠精確到微秒(也就是百萬分之一秒)。

示例**:

要演示stopwatch的使用還是來段**吧。下面是乙個控制台應用程式,它將1到100萬之間的所有整數累加:

using system;

namespace stopwatchclass}}

}   

新增stopwatch物件:

stopwatch類位於system.diagnostics命名空間。下面是新增物件後的**:

using system;

using system.diagnostics;

namespace stopwatchclass}}

}控制stopwatch物件:

stopwatch提供了幾個方法用以控制stopwatch物件。start方法開始乙個計時操作,stop方法停止計時。此時如果第二次使用 start方法,將繼續計時,最終的計時結果為兩次計時的累加。為避免這種情況,在第二次計時前用reset方法將物件歸零。這三個方法都不需要引數。代 碼是:

using system;

using system.diagnostics;

namespace stopwatchclass

timer.stop();}}

}讀取stopwatch結果:

在結束計時後下一步就是讀取計時結果了。stopwatch類提供了一下屬性:

elapsed:返回乙個timespan物件,表示計時時間間隔;

elapsedmilliseconds:返回計時經過的微秒數,精確度稍差,適合於稍長一點的計時;

elapsedticks: 返回計時經過的計時器刻度(timer tick)數。計時器刻度是stopwatch物件可能的最小量度單位。計時器刻度時間的長度由特定的計算機和作業系統確定。stopwatch物件的 frequency靜態欄位的值表示一秒所包含的計時器刻度數。注意它與timespan的ticks屬性所用的時間單位的區別。

應當根據計時任務的情況選擇其中的乙個屬性。在我們的示例程式中,elapsed屬性提供了需要的精確度,用它來輸出經過的微秒數。這也是timespan的最高精確度了。

下面是最終的程式**:

using system;

using system.diagnostics;

namespace stopwatchclass

timer.stop();

decimal micro = timer.elapsed.ticks / 10m;

console.writeline("execution time was microseconds.", micro);}}

}另外,使用isrunning屬性可以檢視乙個stopwatch例項是否正在計時,使用startnew方法可以開始乙個新的計時器。

C 用Stopwatch類進行速度測試

軟體的執行速度必須要在使用者可以接受的範圍內。通常,改善那些短暫的但頻繁使用的例程的速度會大幅度地提高軟體的整體速度。要改善速度,當然首先要能夠量度時間。好,那我們考慮一下在跑道上的情況,槍聲一響,馬上按下秒錶開始計時,在選手到達終點那一刻結束計時,這時就可以知 道該選手所用的時間了。要開始對下一輪...

C 用Stopwatch類進行速度測試

軟體的執行速度必須要在使用者可以接受的範圍內。通常,改善那些短暫的但頻繁使用的例程的速度會大幅度地提高軟體的整體速度。要改善速度,當然首先要能夠量度時間。好,那我們考慮一下在跑道上的情況,槍聲一響,馬上按下秒錶開始計時,在選手到達終點那一刻結束計時,這時就可以知道該選手所用的時間了。要開始對下一輪比...

C 用Stopwatch類進行效能(時間)測試

軟體的執行速度必須要在使用者可以接受的範圍內。通常,改善那些短暫的但頻繁使用的例程的速度會大幅度地提高軟體的整體速度。要改善速度,當然首先要能夠量度時間。好,那我們考慮一下在跑道上的情況,槍聲一響,馬上按下秒錶開始計時,在選手到達終點那一刻結束計時,這時就可以知道該選手所用的時間了。要開始對下一輪比...