C#精確到納秒級(jí)別的計(jì)時(shí)器類實(shí)現(xiàn)代碼
主要用到了win32里面的QueryPerformanceCounter和QueryPerformanceFrequency兩個(gè)函數(shù)
文檔鏈接:https://docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
class NanoSecondTimer
{
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
private long startTime, stopTime;
private long freq;
public NanoSecondTimer()
{
startTime = 0;
stopTime = 0;
if (QueryPerformanceFrequency(out freq) == false)
{
throw new Win32Exception();
}
}
/// <summary>
/// 開始計(jì)時(shí)
/// </summary>
public void Start()
{
Thread.Sleep(0);
QueryPerformanceCounter(out startTime);
}
/// <summary>
/// 停止計(jì)時(shí)
/// </summary>
public void Stop()
{
QueryPerformanceCounter(out stopTime);
}
/// <summary>
/// 返回計(jì)時(shí)器經(jīng)過時(shí)間(單位:秒)
/// </summary>
public double Duration
{
get
{
return (double)(stopTime - startTime) / (double)freq;
}
}
}
QueryPerformanceFrequency這個(gè)函數(shù)會(huì)檢索性能計(jì)數(shù)器的頻率。性能計(jì)數(shù)器的頻率在系統(tǒng)啟動(dòng)時(shí)是固定的,并且在所有處理器上都是一致的。因此,只需在應(yīng)用初始化時(shí)查詢頻率,即可緩存結(jié)果。在運(yùn)行 Windows XP 或更高版本的系統(tǒng)上,該函數(shù)將始終成功,因此永遠(yuǎn)不會(huì)返回零。
下面是測(cè)試代碼:
NanoSecondTimer nanoSecondTimer = new NanoSecondTimer();
nanoSecondTimer.Start();
for (int i = 0; i < 100000; i++)
{
i++;
}
nanoSecondTimer.Stop();
double time = nanoSecondTimer.Duration;
到此這篇關(guān)于C#精確到納秒級(jí)別的計(jì)時(shí)器類的文章就介紹到這了,更多相關(guān)C#計(jì)時(shí)器類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談C#中的for循環(huán)與foreach循環(huán)
本篇文章主要介紹了C#中的for循環(huán)與foreach循環(huán)的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05
Winform圓形環(huán)繞的Loading動(dòng)畫實(shí)現(xiàn)代碼
這篇文章主要介紹了Winform圓形環(huán)繞的Loading動(dòng)畫實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01
基于C#設(shè)計(jì)一個(gè)雙色球選號(hào)工具
這篇文章主要為大家詳細(xì)介紹了如何利用C#設(shè)計(jì)實(shí)現(xiàn)一個(gè)雙色球選號(hào)工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
C#中緩存System.Web.Caching用法總結(jié)
本文詳細(xì)講解了C#中緩存System.Web.Caching的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#操作SQLite數(shù)據(jù)庫(kù)方法小結(jié)(創(chuàng)建,連接,插入,查詢,刪除等)
這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫(kù)方法,包括針對(duì)SQLite數(shù)據(jù)庫(kù)的創(chuàng)建,連接,插入,查詢,刪除等操作,并提供了一個(gè)SQLite的封裝類,需要的朋友可以參考下2016-07-07
Dictionary擴(kuò)展基礎(chǔ)類向字典中添加鍵和值
Dictionary<TKey, TValue> 類是常用的一個(gè)基礎(chǔ)類,但用起來(lái)有時(shí)確不是很方便。本文逐一討論,并使用擴(kuò)展方法解決2013-11-11

