【问题标题】:Why is my Stopwatch.Frequency so low?为什么我的 Stopwatch.Frequency 这么低?
【发布时间】:2010-02-26 23:55:20
【问题描述】:
  Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution);
  Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency);

结果:

  Timer is high-resolution: True
  Timer frequency: 2597705

This 文章(来自 2005 年!)提到频率为 3579545,比我的多一百万。 This 博客文章提到频率为 3,325,040,000,这太疯狂了。

为什么我的频率相对较低?我在 i7 920 机器上,所以它不应该更快吗?

【问题讨论】:

  • 是笔记本电脑吗?通常,机器的时钟频率会根据电池/电源状态进行调整。
  • 这是一个桌面。我将电源设置设置为高性能模式;处理器时钟频率为默认值 (2.66 GHz)。

标签: c# stopwatch


【解决方案1】:

3,579,545 是一个神奇的数字。这是在除以 3 并将其馈入原始 IBM PC 中的 8053 计时器芯片之前的赫兹频率。奇怪的数字不是偶然选择的,它是美国和日本使用的 NTSC 电视系统中color burst signal 的频率。 IBM 工程师正在寻找一种廉价的晶体来实现振荡器,没有什么比每台电视机中使用的晶体更便宜了。

一旦 IBM 克隆变得广泛可用,他们的设计人员选择相同的频率仍然很重要。许多 MS-DOS 软件都依赖于以这种速率计时的计时器。直接寻址芯片是一种常见的犯罪行为。

Windows 出现后,情况发生了变化。一个版本的 Windows 2 是第一个虚拟化计时器芯片的版本。换句话说,不再允许软件直接寻址定时器芯片。处理器被配置为在保护模式下运行,并拦截了使用 I/O 指令的尝试。而是运行内核代码,允许伪造指令的返回值。现在可以让多个程序使用计时器,而不会互相踩到对方的脚趾。打破对硬件实际实现方式的依赖的重要第一步。

Win32 API(Windows NT 3.1 和 Windows 95)通过 API、QueryPerformanceCounter() 和 QueryPerformanceFrequency() 对计时器进行正式访问。内核级组件,即硬件适配层,允许 BIOS 通过该频率。现在硬件设计人员可以真正放弃对精确频率的依赖。顺便说一句,这花了很长时间,大约 2000 年,绝大多数机器仍然具有旧版率。

但是,在 PC 设计中削减成本的永无止境的追求终结了这一点。如今,硬件设计人员只需选择芯片组中恰好可用的任何频率。 3,325,040,000 就是这样一个数字,它很可能是 CPU 时钟频率。像这样的高频在廉价设计中很常见,尤其是那些具有 AMD 内核的设计。你的号码很不寻常,你的机器可能并不便宜。而且计时器要准确得多,CPU 时钟具有典型的电子元件容差。

【讨论】:

  • nobugz,感谢您的详细回答。你能扩展你的最后一段吗?在我看来,更高的频率会提高精度:使用计时器频率。 3.3ghz,我的分辨率是 0.3 纳秒,而我的频率是 385ns。
  • 好吧,您的分辨率要低得多。但是您的计时器可能要准确得多。 3.3 GHz CPU 时钟频率通常只精确到 10%。我不知道事实,这取决于信号是如何产生的。任何以 1 兆赫或更高频率运行的东西对于计时软件来说已经足够好了,线程导致的抖动比这要糟糕得多。
  • @SamPearson 所以可能第二个帖子中的那个人,每秒 3,325,040,000 个滴答声,将Stopwatch.IsHighResolution 设置为 False,因为他的系统直接使用 CPU“时钟”,导致 ±10%根据汉斯的精确度。如果这就是IsHighResolution 的意思,我认为选择“分辨率”一词是不幸的,因为每秒 3,325,040,000 次计数显然比每秒 2,597,705 次计数更高的“分辨率”。分辨率不是准确性或不确定性。
  • 我可以想象两种类型的不准确。 (1) 与真正的 SI 秒(原子时间)相比,规定的频率可能不精确,因此随着时间的推移,Stopwatch 运行始终太慢或始终太快。 (2) 实际实现的频率可能会波动,取决于整个系统的状态,甚至是电源状态、温度等,导致不均匀的Stopwatch(有时比其他时间慢)。如果您想与真正的秒表竞争,那么问题 (1) 很糟糕。如果您使用Stopwatch 比较性能,则问题(2)最糟糕。
  • @JeppeStigNielsen 这将是对他的解释的误解,如果 IsHighResolution 设置为 false,则频率将等于“DateTime”滴答声,即 10.000.000 / 秒。不幸的是,它并不是在每个滴答声中都更新,并且可能与每 ~ 150.000 个滴答声更新一样慢(可能更不频繁?)
【解决方案2】:

频率取决于 HAL(硬件抽象层)。回到 pentium 时代,通常使用 CPU 滴答(基于 CPU 时钟频率),所以你最终得到了非常高频率的计时器。

对于多处理器和多核机器,尤其是对于使用 CPU 滴答的可变速率 CPU(在低功耗状态下 CPU 时钟变慢),因为计时器变得困难且容易出错,因此 HAL 的编写者似乎选择使用较慢但更可靠的硬件时钟,例如实时时钟。

【讨论】:

    【解决方案3】:

    Stopwatch.Frequency 值是每秒,因此您的频率为 2,597,705 意味着您每秒有超过 250 万个滴答声。您究竟需要多少精度?

    至于频率的变化,这取决于硬件。一些最常见的硬件差异是核心数量、每个核心的频率、您的 cpu(或核心)的当前电源状态、您是否启用了操作系统来动态调整 cpu 频率等。您的频率不会总是一样的,根据你检查时你的cpu处于什么状态,它可能会更低或更高,但大致相同(对你来说,可能在250万左右。)

    【讨论】:

      【解决方案4】:

      我认为 2,597,705 = 您的处理器频率。迈恩是 2,737,822。 i7 930

      【讨论】:

      • 几乎没有。如今,2.6 MHz 将是一个相当慢的处理器频率;)
      • 是的,你是对的!对此感到抱歉。这家伙做错了什么。我认为秒表在调试模式下不能很好地工作。
      • :) 。秒表和调试...太多文章我想回顾一下...归结为 -> 性能测量高度很棘手。只是为了好玩:我的频率:3,320,390,I7 2600k。
      猜你喜欢
      • 2020-02-05
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2019-06-11
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多