goim 代码中 取模和位运算的区别

在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 消耗,带来明显性能提升。

输入图片说明

评论

(= ̄ω ̄=)··· 暂无内容!

回复

邮箱