如何证明 AND 指令在商品 Intel x86 上比 IDIV 更快

How to prove that AND instruction is faster than IDIV on a commodity Intel x86

据我所知,在 Intel x86(例如,Ice Lake 微架构)上,我预计两个无符号整数的 AND 比相同的两个整数的 IDIV 更快.但是,如果我写一个程序来真正测量时间,就很难看出差异了。

测量时间,我用的是time.h,代码基本如下:

integer_A = rand();
integer_B = rand();
start = clock();
for (size_t i=0; i<(1<<26); i++)
    integer_A &[or % to get IDIV] integer_B
end = clock();
elapsed_time = (end - start) / CLOCKS_PER_SEC;

我怎样才能更好地重现测量结果来证明 ANDIDIV 快(如果是这样的话)?

我知道 time.h 测量结果不完美。但是,在任何人都可以在笔记本电脑上 运行 证明 ANDIDIV 快的程序中,我能做的最好的是什么?

您的测量代码无效。任何不是完全开玩笑的编译器都不会为 for 循环发出任何代码,因为结果未被使用。就算用了,因为每次迭代都是一样的,所以只会执行一次,花在单次操作上的时间会在测量噪声中丢失。

要正确测量,您需要

  1. 创建在每次迭代中实际执行计算的义务
  2. 确保 clock 调用(或您用来执行计时的任何其他函数)根据操作进行排序;否则整个计算可以重新排序 before/after 他们两个

一种原则上应该可以做到这一点的方法是使用 volatile 对象,其中每次访问都应被编译器视为具有副作用。但是,这将向您正在测量其时间的操作添加常量内存 loads/stores。