为什么我的秒表。频率如此之低?

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机器上,所以不应该更快吗?

3,579,545是神奇的数字。 这是Hertz将频率除以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()forms化对计时器的访问。 内核级组件硬件适配层允许BIOS通过该频率。 现在,硬件设计人员可以真正降低对确切频率的依赖性。 这需要很长时间,在2000年左右,绝大多数机器仍然具有传统速率。

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

频率取决于HAL(硬件抽象层)。 回到奔腾时代,通常使用CPU滴答(基于CPU时钟速率),因此您最终得到了真正的高频定时器。

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

Stopwatch.Frequency值是每秒,所以你的频率2,597,705意味着你每秒有超过250万的滴答。 究竟需要多少精度?

至于频率的变化,这是与硬件有关的事情。 一些最常见的硬件差异是核心数量,每个核心的频率,CPU(或核心)的当前电源状态,是否已启用操作系统以动态调整CPU频率等。您的频率不会总是相同,并且根据你检查它时你的cpu状态,它可能更低或更高,但通常大致相同(对你来说,可能大约250万。)

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