11
  Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution);
  Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency);

结果:

  Timer is high-resolution: True
  Timer frequency: 2597705

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

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

4

4 回答 4

26

3,579,545 是一个神奇的数字。这是在除以 3 并将其馈入原始 IBM PC 中的 8053 计时器芯片之前的赫兹频率。奇怪的数字不是偶然选择的,它是美国和日本使用的 NTSC 电视系统中色同步信号的频率。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 时钟具有典型的电子元件容差。

于 2010-02-27T01:50:27.577 回答
7

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

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

于 2010-02-27T00:00:27.717 回答
1

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

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

于 2010-02-27T00:04:08.133 回答
1

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

于 2012-08-03T21:17:46.853 回答