考虑到Stopwatch类在C#中可以使用类似于下面三个不同的定时器。
+-10 ms的精度,取决于可以用timeBeginPeriod设置的定时器分辨率,它可以是+-1 ms。400 ns,所以理想的精度。40 ns,所以理想的精度。我们如何测量它的可观测精度?精度被定义为
精度指的是两个或两个以上的测量彼此之间的紧密程度。
现在,如果Stopwatch使用Stopwatch,这是否意味着我们可以使用Stopwatch来获得与计时器频率相等的测量精度?
我不这么认为,因为这要求我们能够使用具有零方差或完全固定开销的计时器,据我所知,这对于Stopwatch来说不是真的。例如,当使用HPET并调用:
var before_ticks = Stopwatch.GetTimestamp();
var after_ticks = Stopwatch.GetTimestamp();
var diff_ticks = after_ticks - before_ticks;然后,差别将是大约100 ticks或4000 ns,它也会有一些差异。
那么,如何在实验上测量Stopwatch的可观测精度呢?所以它支持下面所有可能的计时器模式。
我的想法是搜索最小的蜱数!= 0,首先建立Stopwatch的刻度开销,即系统定时器的开销为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();首先,可以找到一个下限,对于给定数量的iterations,所有的测量值(例如10个)都会产生一个非零的蜱数,将这些测量值保存在long ticksLower[10]中。然后,产生滴答差的最接近可能的迭代次数总是比前10个度量中的任何一个都要高,但在long ticksUpper[10]中除外。
在最坏的情况下,精度将是ticksUpper中最高的滴答减去ticksLower中最低的滴答。
这听起来合理吗?
为什么我想知道Stopwatch的可观测精度?因为这可以用来确定你需要测量的时间长度,以获得一定程度的微基准测量的精度。也就是说,对于3位精度,长度应该是定时器精度的1000倍以上。当然,我们可以用这个长度来多次测量。
发布于 2016-03-30 19:58:30
秒表类公开一个频率属性,该属性是调用SafeNativeMethods.QueryPerformanceFrequency的直接结果。以下是属性页的摘录:
频率值取决于底层定时机制的分辨率。如果安装的硬件和操作系统支持高分辨率性能计数器,则频率值反映该计数器的频率。否则,频率值是基于系统定时器频率。
https://stackoverflow.com/questions/36318291
复制相似问题