有没有办法使用 C 或汇编程序甚至 C# 来准确测量执行 ADD 指令所需的时间?
是的,有点,但它并不平凡,并且产生的结果是almost毫无意义,至少在最现代的处理器上是这样。
在相对较慢的处理器上(例如,从英特尔系列中的原始奔腾处理器开始,在大多数小型嵌入式处理器上仍然如此),您只需查看处理器的数据表,它(通常)会告诉您期望的时钟滴答数。快速、简单、容易。
在现代台式机(例如 Pentium Pro 或更新版本)上,生活并不nearly就这么简单。这些 CPU 可以一次执行多条指令,并且只要它们之间不存在任何依赖关系,就可以乱序执行它们。这意味着单个指令所花费的时间的整个概念变得几乎毫无意义。执行一条指令所花费的时间可以并且将取决于它周围的指令。
也就是说,是的,如果你真的想要,你可以(通常 - 取决于处理器)测量一些东西,尽管它到底意味着什么仍然存在相当大的问题。即使得到这样的结果也只是close to无意义而不是完全无意义并不是微不足道的。例如,在 Intel 或 AMD 芯片上,您可以使用 RDTSC 本身进行时序测量。不幸的是,如上所述,这可能会乱序执行。为了获得有意义的结果,您需要用一条不能乱序执行的指令(“序列化指令”)包围它。最常见的选择是CPUID
,因为它是可用于“用户模式”(即环 3)程序的少数序列化指令之一。不过,这本身就增加了一些扭曲:根据英特尔的记录,处理器执行 CPUID 的前几次可能比后续时间花费更长的时间。因此,他们建议您执行它three在你使用它来序列化你的计时之前。因此,一般顺序是这样的:
.align 16
CPUID
CPUID
CPUID
RDTSC
; sequence under test
Add eax, ebx
; end of sequence under test
CPUID
RDTSC
然后,将其与执行相同操作但删除了测试序列的结果进行比较。当然,这遗漏了相当多的细节——至少你需要:
- 在每个CPUID之前正确设置寄存器
- 在第一个 RDTSC 之后将值保存在 EAX:EDX 中
- 从第一个 RDTSC 中减去第二个 RDTSC 的结果
另请注意我插入的“align”指令——指令对齐也会影响时序,特别是在涉及循环的情况下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)