我对按位运算所需的周期数有疑问,或者更确切地说,是XOR运算所需的周期数。在我的程序中,我有两个uint8_t变量的一维数组,固定大小为8.我想对两个数组进行异或,我想知道最有效的方法是什么。这是一个总结我发现的选项的代码:
int main() {
uint8_t tab[4] = {1,0,0,2};
uint8_t tab2[4] = {2,3,4,1};
/* First option */
uint8_t tab3[4] = {tab[0]^tab2[0], tab[1]^tab2[1], tab[2]^tab2[2], tab[3]^tab2[3]};
/* Second option */
uint32_t* t = tab;
uint32_t* t2 = tab2;
uint32_t t3 = *t ^ *t2;
uint8_t* tab4 = &t3;
/* Comparison */
printf("%d & %d\n", tab3[0], tab4[0]);
printf("%d & %d\n", tab3[1], tab4[1]);
printf("%d & %d\n", tab3[2], tab4[2]);
printf("%d & %d\n", tab3[3], tab4[3]);
return 0;
}
从周期/字节的角度来看,最佳选择是什么?
答案 0 :(得分:5)
所有基本二进制操作 - 和,或, xor ,不 - 在一个时钟周期内执行(或更少)自20世纪60年代以来几乎每个处理器架构。我说“或更少”,因为取指令,跟踪就绪寄存器等的开销可能会将二进制运算时间放入噪声中。
为了使算法更快,有必要研究数据的缓存特性。
大多数使用二进制运算进行运算的实用算法都会比关联的I / O快。散列算法(如SHA family)可能是个例外。
答案 1 :(得分:0)
单个整数运算通常比四个单字节运算更快。例如,使用单指令循环的memchr():面向字节的rep scasb比memchr()的整数优化版本慢,即使每个整数涉及大约12条指令。