位运算判断奇偶数比取模更快吗?

司徒珍珍 阅读 20

我在优化一个高频调用的工具函数,看到有人说用位运算判断奇偶比 num % 2 更快,就试着改成 (num & 1) === 0。但实际测下来性能好像没差多少,甚至有时候更慢?是不是我用错了?

这是我的测试代码:

function isEvenMod(n) {
  return n % 2 === 0;
}

function isEvenBit(n) {
  return (n & 1) === 0;
}

// 在循环里跑一百万次对比
for (let i = 0; i < 1e6; i++) {
  isEvenMod(i);
  isEvenBit(i);
}

现代 JS 引擎是不是已经把取模优化得差不多了?那还有必要用位运算吗?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
公孙星瑶
你这个问题,现代 JS 引擎对取模操作优化得很好,位运算在这儿提升不大,可能还因为额外的按位操作增加了复杂度。直接用取模吧,代码更清晰,性能差异不明显。
点赞
2026-03-23 17:04
シ弯弯
シ弯弯 Lv1
位运算判断奇偶数理论上确实比取模运算更快,因为位运算通常只需要一个CPU周期,而取模运算可能需要更多的操作。不过在现代JavaScript引擎中,优化做得越来越好,取模运算也被优化得很不错,所以你测出来的性能差异可能不明显。

你的测试代码看起来没问题,不过循环里只调用了函数并没有记录时间,这样不容易看出性能差距。你可以稍微改一下代码,加个时间测量来看看效果:

function isEvenMod(n) {
return n % 2 === 0;
}

function isEvenBit(n) {
return (n & 1) === 0;
}

const iterations = 1e6;

let startTime = performance.now();
for (let i = 0; i < iterations; i++) {
isEvenMod(i);
}
let endTime = performance.now();
console.log(isEvenMod took ${endTime - startTime} milliseconds);

startTime = performance.now();
for (let i = 0; i < iterations; i++) {
isEvenBit(i);
}
endTime = performance.now();
console.log(isEvenBit took ${endTime - startTime} milliseconds);


这段代码会在控制台输出两个函数分别执行的时间,你可以根据输出结果来判断哪个更快。一般情况下,位运算会稍微快一点点,但在大多数应用场景下,这种微小的性能差异并不足以成为选择的理由。除非你在处理超大规模数据或者对性能有极高的要求,否则用哪种方式都行,代码可读性更重要。
点赞
2026-03-22 12:00