位移执行时间
Execution time of bitwise shift
我的问题是关于在 C++ 中按位移动整数变量。
将整数移位 n (i << n) 的执行时间是否等于将该整数移位 n 次 1 (i << 1)?
我不会使用循环移动 n 次。假设 n = 8。例如我想比较以下函数的执行时间:
void f1(int i) {
i <<= 8;
}
void f2(int i) {
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
}
也就是说如果(i << 8)和(i << 1)同时执行?
编辑:
<<=
别名按位左移是在大多数 CPU 上直接翻译成单个机器代码指令。由于历史原因,在 x86 CPU 系列上,两种移位变体都可用,可以是专门移位一位,也可以是通用移位立即数 #n(或者甚至是完全动态的移位,按其他寄存器 cl
中的数字移位)。但是例如在类似于 RISC 的 ARM CPU 上,只有 n 次移位,所以即使 <<=1
也被翻译成与 <<=8
相同的指令,只是参数不同(而且执行速度是恒定的)。
没有。大多数现代 CPU shift 的两种变体(按 1 或 #n)执行的时间相同。
在历史上 CPUs,当 shift-by-#n 可用时,它可能比 shift-by-1 慢一点(如果 shift-by-1 指令也可用) ,但通常比调用 shift-by-1 #n 次要快得多。
嗯,这只是 "IIRC",所以我选择了 google (source):80386 已经有相同的时序,但从 80286 的细节来看,它很棘手。 .. 看起来对于某些 n
来说,将它写成几个班次可能会更快。所以..这个问题好像晚了 ~30 年。
我的问题是关于在 C++ 中按位移动整数变量。 将整数移位 n (i << n) 的执行时间是否等于将该整数移位 n 次 1 (i << 1)?
我不会使用循环移动 n 次。假设 n = 8。例如我想比较以下函数的执行时间:
void f1(int i) {
i <<= 8;
}
void f2(int i) {
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
i <<= 1;
}
也就是说如果(i << 8)和(i << 1)同时执行?
编辑:
<<=
别名按位左移是在大多数 CPU 上直接翻译成单个机器代码指令。由于历史原因,在 x86 CPU 系列上,两种移位变体都可用,可以是专门移位一位,也可以是通用移位立即数 #n(或者甚至是完全动态的移位,按其他寄存器 cl
中的数字移位)。但是例如在类似于 RISC 的 ARM CPU 上,只有 n 次移位,所以即使 <<=1
也被翻译成与 <<=8
相同的指令,只是参数不同(而且执行速度是恒定的)。
没有。大多数现代 CPU shift 的两种变体(按 1 或 #n)执行的时间相同。
在历史上 CPUs,当 shift-by-#n 可用时,它可能比 shift-by-1 慢一点(如果 shift-by-1 指令也可用) ,但通常比调用 shift-by-1 #n 次要快得多。
嗯,这只是 "IIRC",所以我选择了 google (source):80386 已经有相同的时序,但从 80286 的细节来看,它很棘手。 .. 看起来对于某些 n
来说,将它写成几个班次可能会更快。所以..这个问题好像晚了 ~30 年。