如何证明 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;
我怎样才能更好地重现测量结果来证明 AND
比 IDIV
快(如果是这样的话)?
我知道 time.h
测量结果不完美。但是,在任何人都可以在笔记本电脑上 运行 证明 AND
比 IDIV
快的程序中,我能做的最好的是什么?
您的测量代码无效。任何不是完全开玩笑的编译器都不会为 for 循环发出任何代码,因为结果未被使用。就算用了,因为每次迭代都是一样的,所以只会执行一次,花在单次操作上的时间会在测量噪声中丢失。
要正确测量,您需要
- 创建在每次迭代中实际执行计算的义务
- 确保
clock
调用(或您用来执行计时的任何其他函数)根据操作进行排序;否则整个计算可以重新排序 before/after 他们两个
一种原则上应该可以做到这一点的方法是使用 volatile
对象,其中每次访问都应被编译器视为具有副作用。但是,这将向您正在测量其时间的操作添加常量内存 loads/stores。
据我所知,在 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;
我怎样才能更好地重现测量结果来证明 AND
比 IDIV
快(如果是这样的话)?
我知道 time.h
测量结果不完美。但是,在任何人都可以在笔记本电脑上 运行 证明 AND
比 IDIV
快的程序中,我能做的最好的是什么?
您的测量代码无效。任何不是完全开玩笑的编译器都不会为 for 循环发出任何代码,因为结果未被使用。就算用了,因为每次迭代都是一样的,所以只会执行一次,花在单次操作上的时间会在测量噪声中丢失。
要正确测量,您需要
- 创建在每次迭代中实际执行计算的义务
- 确保
clock
调用(或您用来执行计时的任何其他函数)根据操作进行排序;否则整个计算可以重新排序 before/after 他们两个
一种原则上应该可以做到这一点的方法是使用 volatile
对象,其中每次访问都应被编译器视为具有副作用。但是,这将向您正在测量其时间的操作添加常量内存 loads/stores。