这篇文章给大家分享的是有关C#如何实现精确到纳秒级别的计时器类的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
主要用到了win32里面的QueryPerformanceCounter和QueryPerformanceFrequency两个函数
文档链接: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>
/// 开始计时
/// </summary>
public void Start()
{
Thread.Sleep(0);
QueryPerformanceCounter(out startTime);
}
/// <summary>
/// 停止计时
/// </summary>
public void Stop()
{
QueryPerformanceCounter(out stopTime);
}
/// <summary>
/// 返回计时器经过时间(单位:秒)
/// </summary>
public double Duration
{
get
{
return (double)(stopTime - startTime) / (double)freq;
}
}
}
QueryPerformanceFrequency这个函数会检索性能计数器的频率。性能计数器的频率在系统启动时是固定的,并且在所有处理器上都是一致的。因此,只需在应用初始化时查询频率,即可缓存结果。在运行 Windows XP 或更高版本的系统上,该函数将始终成功,因此永远不会返回零。
下面是测试代码:
NanoSecondTimer nanoSecondTimer = new NanoSecondTimer();
nanoSecondTimer.Start();
for (int i = 0; i < 100000; i++)
{
i++;
}
nanoSecondTimer.Stop();
double time = nanoSecondTimer.Duration;
感谢各位的阅读!关于“C#如何实现精确到纳秒级别的计时器类”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。