首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计时器的测量精度(例如秒表/QueryPerformanceCounter)

计时器的测量精度(例如秒表/QueryPerformanceCounter)
EN

Stack Overflow用户
提问于 2016-03-30 19:45:28
回答 1查看 1.3K关注 0票数 4

考虑到Stopwatch类在C#中可以使用类似于下面三个不同的定时器。

  • 系统定时器,例如,大约+-10 ms的精度,取决于可以用timeBeginPeriod设置的定时器分辨率,它可以是+-1 ms
  • 时间邮票计数器(TSC),例如,刻度频率为2.5MHz或1滴答= 400 ns,所以理想的精度。
  • 高精度事件计时器,例如,刻度频率为25兆赫或1刻度= 40 ns,所以理想的精度。

我们如何测量它的可观测精度?精度被定义为

精度指的是两个或两个以上的测量彼此之间的紧密程度。

现在,如果Stopwatch使用Stopwatch,这是否意味着我们可以使用Stopwatch来获得与计时器频率相等的测量精度?

我不这么认为,因为这要求我们能够使用具有零方差或完全固定开销的计时器,据我所知,这对于Stopwatch来说不是真的。例如,当使用HPET并调用:

代码语言:javascript
复制
var before_ticks = Stopwatch.GetTimestamp();
var after_ticks = Stopwatch.GetTimestamp();
var diff_ticks = after_ticks - before_ticks;

然后,差别将是大约100 ticks4000 ns,它也会有一些差异。

那么,如何在实验上测量Stopwatch的可观测精度呢?所以它支持下面所有可能的计时器模式。

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

但这并没有说明我们能用计时器来测量多精确。我的定义是,我们可以可靠地测量出滴答之间的微小差别。

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

代码语言:javascript
复制
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();

首先,可以找到一个下限,对于给定数量的iterations,所有的测量值(例如10个)都会产生一个非零的蜱数,将这些测量值保存在long ticksLower[10]中。然后,产生滴答差的最接近可能的迭代次数总是比前10个度量中的任何一个都要高,但在long ticksUpper[10]中除外。

在最坏的情况下,精度将是ticksUpper中最高的滴答减去ticksLower中最低的滴答。

这听起来合理吗?

为什么我想知道Stopwatch的可观测精度?因为这可以用来确定你需要测量的时间长度,以获得一定程度的微基准测量的精度。也就是说,对于3位精度,长度应该是定时器精度的1000倍以上。当然,我们可以用这个长度来多次测量。

EN

回答 1

Stack Overflow用户

发布于 2016-03-30 19:58:30

秒表类公开一个频率属性,该属性是调用SafeNativeMethods.QueryPerformanceFrequency的直接结果。以下是属性页的摘录:

频率值取决于底层定时机制的分辨率。如果安装的硬件和操作系统支持高分辨率性能计数器,则频率值反映该计数器的频率。否则,频率值是基于系统定时器频率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36318291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档