c# – 测量定时器的精度(例如秒表 QueryPerformanceCounter)

c# – 测量定时器的精度(例如秒表 QueryPerformanceCounter),第1张

概述鉴于C#中的秒表类可以使用下面的三个不同的定时器. >系统计时器例如精度约为-10 ms,具体取决于可用timeBeginPeriod设定的定时器分辨率,约为-1 ms. >时间戳计数器(TSC),例如滴答频率为2.5MHz或1滴= 400 ns,理想情况下是精确度. >高精度事件定时器(HPET),例如滴答频率为25MHz或1滴= 40 ns,理想情况下是精确度. 我们如何衡量这种可观察的精度? 鉴于C#中的秒表类可以使用下面的三个不同的定时器.

>系统计时器例如精度约为-10 ms,具体取决于可用timeBeginPeriod设定的定时器分辨率,约为-1 ms.
>时间戳计数器(TSC),例如滴答频率为2.5MHz或1滴= 400 ns,理想情况下是精确度.
>高精度事件定时器(HPET),例如滴答频率为25MHz或1滴= 40 ns,理想情况下是精确度.

我们如何衡量这种可观察的精度?精度被定义为

Precision refers to the closeness of two or more measurements to each
other.

现在,如果秒表使用HPET,这是否意味着我们可以使用秒表来测量与定时器频率相当的精度?

我不这么认为,因为这要求我们能够使用零差异或完全固定开销的计时器,据我所知,对于秒表来说并非如此.例如,使用HPET并调用时:

var before_ticks = Stopwatch.GetTimestamp();var after_ticks = Stopwatch.GetTimestamp();var diff_ticks = after_ticks - before_ticks;

那么diff会说大约100个滴答或4000 ns,它也会有一些变化.

那么如何通过实验测量秒表的可观测精度呢?所以它支持下面所有可能的定时器模式.

我的想法是搜索最小滴答数!= 0,首先建立用于系统定时器的秒表滴答的开销,这将是0,直到例如10ms,即10 * 1000 * 10 = 100,000个刻度,因为系统定时器的刻度分辨率为100ns,但精度远不是这个.对于HPET,它永远不会为0,因为调用Stopwatch.GetTimestamp()的开销高于计时器的频率.

但这并没有说明我们使用定时器测量的精确程度.我的定义是我们可以可靠地测量的差异有多小.

可以通过测量不同的迭代次数ala来执行搜索:

var before = Stopwatch.GetTimestamp();for (int i = 0; i < iterations; ++i){    action(); // Calling a no-op delegate Action since this cannot be inlined}var after = Stopwatch.GetTimestamp();

首先,可以找到下限,其​​中对于给定迭代次数的所有10个测量结果都产生非零数量的刻度,将这些测量结果保存在长ticksLower [10]中.然后,最接近可能的迭代次数产生的滴答差异始终高于前10个测量中的任何一个,将其保存在long ticksUpper [10]中.

最差情况精度将是ticksUpper中的最高刻度减去ticksLower中的最低刻度.

这听起来合理吗?

为什么我想知道秒表的可观察精度?因为这可以用于确定您需要测量的时间长度,以获得微基准测量的一定精度水平.即对于3位精度,长度应该是计时器精度的> 1000倍.当然,人们可以用这个长度多次测量.

解决方法@H_403_55@ Stopwatch类公开 Frequency属性,这是调用SafeNativeMethods. QueryPerformanceFrequency的直接结果.以下是属性页面的摘录:

The Frequency value depends on the resolution of the underlying timing mechanism. If the installed harDWare and operating system support a high-resolution performance counter,then the Frequency value reflects the frequency of that counter. Otherwise,the Frequency value is based on the system timer frequency.

总结

以上是内存溢出为你收集整理的c# – 测量定时器的精度(例如秒表/ QueryPerformanceCounter)全部内容,希望文章能够帮你解决c# – 测量定时器的精度(例如秒表/ QueryPerformanceCounter)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1226854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存