C#計(jì)算代碼執(zhí)行時(shí)間的方法
最近遇到一個(gè)模塊其執(zhí)行時(shí)間非常短,但是調(diào)用頻率非常高。精確計(jì)算其運(yùn)算時(shí)間對(duì)于提高程序整體效率來(lái)說(shuō)非常重要。
在我剛剛接觸.Net時(shí),也曾經(jīng)想要測(cè)試一下自己寫的程序的運(yùn)行時(shí)間,當(dāng)時(shí)我使用的是將兩個(gè)DateTime.Now相減的笨方法,呵呵。后來(lái)知道使用Environment.TickCount,對(duì)于一般的測(cè)試來(lái)說(shuō)就足夠了。但是它對(duì)于高精度測(cè)試就沒(méi)什么辦法,經(jīng)常是返回個(gè)0了事。對(duì)于高精度測(cè)試我們應(yīng)當(dāng)使用QueryPerformanceFrequency函數(shù)和QueryPerformanceCounter函數(shù)。通過(guò)它們可以獲得比Environment.TickCount更高的精確度。實(shí)際上Environment.TickCount就是在調(diào)用QueryPerformanceFrequency函數(shù)和QueryPerformanceCounter函數(shù)。
下面是我使用的代碼:
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);
//需要測(cè)試的模塊
QueryPerformanceCounter(ref count1);
count = count1-count;
result = (double)(count)/(double)freq;
Console.WriteLine("耗時(shí): {0} 秒", result);
Console.ReadLine();
}
}
這樣能夠得到非常精確的結(jié)果。但是模塊每次運(yùn)行的時(shí)間總會(huì)有些誤差,而當(dāng)計(jì)算非常精確的時(shí)候,這些運(yùn)行時(shí)間的誤差也顯得比較明顯了。為此我對(duì)其進(jìn)行循環(huán)多次測(cè)試使其誤差平均化,通過(guò)多次測(cè)試的結(jié)果來(lái)進(jìn)行執(zhí)行效率的分析。
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);
//開(kāi)始的時(shí)候沒(méi)有這層循環(huán),所得數(shù)據(jù)浮動(dòng)很大,添加這層循環(huán)來(lái)使得結(jié)果更加平均
for (int i=0; i<500; i++)
{
//需要測(cè)試的模塊
}
QueryPerformanceCounter(ref count1);
count = count1-count;
result = (double)(count)/(double)freq;
Console.WriteLine("耗時(shí): {0} 秒", result);
Console.ReadLine();
}
}
C#中的秒表 計(jì)算程序運(yùn)行了多長(zhǎng)時(shí)間 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("執(zhí)行時(shí)間: " + myUseTime.ToString() + " ms");
}
相關(guān)文章
C#實(shí)現(xiàn)語(yǔ)音視頻錄制-附demo源碼
在很多語(yǔ)言視頻軟件系統(tǒng)中,經(jīng)常有將實(shí)時(shí)的音頻或者是視頻錄制為文件保存到磁盤空間的需求,本篇給大家講C#實(shí)現(xiàn)語(yǔ)音視頻錄制-附demo源碼,感興趣的朋友一起來(lái)學(xué)習(xí)吧2015-08-08c#連接access數(shù)據(jù)庫(kù)操作類分享
本文介紹了c#連接access數(shù)據(jù)庫(kù)的方法,可以執(zhí)行刪除、更新、插入等操作,大家參考使用吧2014-01-01c#實(shí)現(xiàn)sunday算法實(shí)例
Sunday算法思想跟BM算法很相似,在匹配失敗時(shí)關(guān)注的是文本串中參加匹配的最末位字符的下一位字符,下面是用C#實(shí)現(xiàn)sunday的實(shí)例代碼,有需要的朋友可以參考一下2013-08-08分享WCF聊天程序--WCFChat實(shí)現(xiàn)代碼
無(wú)意中在一個(gè)國(guó)外的站點(diǎn)下到了一個(gè)利用WCF實(shí)現(xiàn)聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了測(cè)試和部分修改,感覺(jué)還不錯(cuò),分享給大家2015-11-11