在goim ring代码中,有位运算&的操作。
然后这就引发了一个疑问,为什么不用取模
这是因为,在cpu层面,%不是一个便宜的操作,它通常被翻译成除法运算,而除法运算相对于其他运算是比较慢的。
idx := i % num
除法操作 通常比加/位运算慢一个数量级。
所以就完全可以用下边代替,这个前提条件是num是2的幂(2, 4, 8, 16 …)
idx := i & (num - 1)
2 的幂在二进制里总是 1000...0
num - 1 则是 0111...1
i & (num-1) 的效果就是只保留 i 的低几位,等价于 % num
在高并发场景(IM 系统、网络 I/O)里,每秒可能要执行 百万次 RingBuffer 下标计算,用位运算能减少 CPU 消耗,带来明显性能提升。
评论