Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution);
Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency);结果:
Timer is high-resolution: True
Timer frequency: 2597705This文章(出自2005年!)提到的频率是3579545,比我多一百万。This博客文章提到频率为3,325,040,000,这太疯狂了。
为什么我的频率要低得多?我使用的是i7 920机器,所以它不是应该更快吗?
发布于 2010-02-27 09:50:28
3579,545是一个神奇的数字。这是以赫兹为单位的频率,然后除以3,输入到最初的IBM PC的8053定时器芯片中。这个看起来奇怪的数字不是偶然选择的,它是美国和日本使用的NTSC系统中color burst signal的频率。IBM的工程师们正在寻找一种廉价的晶体来实现振荡器,没有什么比每台电视机中使用的晶体更便宜了。
一旦IBM克隆广泛使用,它们的设计者选择相同的频率仍然很重要。很多MS-DOS软件都依赖于定时器的滴答声。直接寻址芯片是一种常见的犯罪。
一旦Windows出现,这种情况就改变了。Windows2的一个版本是第一个虚拟化计时器芯片的版本。换句话说,软件不再被允许直接寻址定时器芯片。处理器被配置为在保护模式下运行,并截获了使用I/O指令的尝试。而是运行内核代码,允许伪造指令的返回值。现在有可能有多个程序使用计时器,而不会彼此踩到脚趾。这是打破对硬件实际实现方式的依赖的重要第一步。
Windows (Windows NT3.1和Windows95)使用Win32、QueryPerformanceCounter()和QueryPerformanceFrequency()对定时器进行了正式访问。内核级组件,硬件适配层,允许BIOS通过该频率。现在,硬件设计人员可以真正放弃对精确频率的依赖。这花了很长时间,顺便说一句,在2000年左右,绝大多数机器仍然具有传统的速率。
但永无止境的削减个人电脑设计成本的追求结束了这种局面。如今,硬件设计者只选择芯片组中恰好可用的任何频率。3,325,040,000将是这样一个数字,它很可能是CPU时钟频率。像这样的高频在廉价的设计中很常见,特别是那些有AMD核心的设计。你的号码很不寻常,可能你的机器不便宜。而且定时器要精确得多,CPU时钟具有典型的电子元件公差。
发布于 2010-02-27 08:00:28
频率取决于硬件抽象层( HAL )。在奔腾时代,使用CPU节拍(这是基于CPU时钟频率)是很常见的,所以你最终得到了非常高频率的定时器。
对于多处理器和多核机器,特别是使用CPU节拍的可变速率CPU (CPU时钟在低功率状态下会变慢),因为计时器变得困难且容易出错,因此HAL的编写者似乎选择使用较慢但更可靠的硬件时钟,如实时时钟。
发布于 2010-02-27 08:04:08
Stopwatch.Frequency的值是每秒,因此2,597,705的频率意味着每秒有超过250万次的Stopwatch.Frequency。你到底需要多高的精度?
至于频率的变化,这是一个依赖于硬件的事情。一些最常见的硬件差异是内核数量、每个内核的频率、cpu (或多个内核)的当前电源状态、您是否启用了操作系统动态调整cpu频率等。您的频率并不总是相同的,并且根据您检查cpu时的状态,它可能更低或更高,但通常是相同的(对于您来说,可能在250万左右)。
https://stackoverflow.com/questions/2345599
复制相似问题