C#計(jì)算代碼執(zhí)行時(shí)間的方法
最近遇到一個(gè)模塊其執(zhí)行時(shí)間非常短,但是調(diào)用頻率非常高。精確計(jì)算其運(yùn)算時(shí)間對(duì)于提高程序整體效率來(lái)說(shuō)非常重要。
在我剛剛接觸.Net時(shí),也曾經(jīng)想要測(cè)試一下自己寫(xiě)的程序的運(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# Onnx實(shí)現(xiàn)特征匹配DeDoDe檢測(cè)
這篇文章主要為大家詳細(xì)介紹了C# Onnx如何實(shí)現(xiàn)特征匹配DeDoDe檢測(cè),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及密碼的方法
同為微軟的產(chǎn)品,本文將討論的是C#如何創(chuàng)建Access數(shù)據(jù)庫(kù),同時(shí)創(chuàng)建數(shù)據(jù)庫(kù)密碼與相關(guān)操作,希望對(duì)大家有所幫助。2015-09-09
C#中加鹽(salting)的實(shí)現(xiàn)示例
在密碼存儲(chǔ)和驗(yàn)證中,加鹽是一種增加密碼安全性的技術(shù),本文主要介紹了C#中加鹽(salting)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
C#實(shí)現(xiàn)3步手動(dòng)建DataGridView的方法
這篇文章主要介紹了C#實(shí)現(xiàn)3步手動(dòng)建DataGridView的方法,實(shí)例分析了C#實(shí)現(xiàn)手動(dòng)創(chuàng)建DataGridView的原理與技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
C#使用Consul集群進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn)
這篇文章主要介紹了C#使用Consul集群進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
c# 使用WebRequest實(shí)現(xiàn)多文件上傳
這篇文章主要介紹了c# 使用WebRequest實(shí)現(xiàn)多文件上傳的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03

