将值重新分配给变量时的 Javascript 性能

Vic*_*ina 2 javascript performance

我有一个最初是假的布尔值。但是在未来的某个时候,如果它的值发生变化(可以更改多次,但只能更改为相同的)。

例如,使用给定的伪代码

const hasChanged = false; // stateful

// This function can be called multipe times
const handleSubmit = () => {
   // ...
   hasChanged = true;
   // ...
}
Run Code Online (Sandbox Code Playgroud)

我总是将值 'true' 重新分配给我的布尔值......我认为,也许可以通过首先检查它是否为假来优化它,如下所示:

const handleSubmit = () => {
   // ...
   !hasChanged && hasChanged = true;
   // ...
}
Run Code Online (Sandbox Code Playgroud)

但这只有在条件检查(读取 + 检查)比 JS 中的写入操作更快时才成立,这是我不知道的。

有任何想法吗?

Cer*_*nce 8

无条件分配值,而不先测试它,可能会快一点:

作为一般经验法则,分支比直线代码慢(在所有 CPU 和所有编程语言上)。- jmrk,V8 开发者

这与著名问题背后的推理思路相同:为什么处理排序数组比处理未排序数组更快?

也就是说,这极不可能成为性能瓶颈。这不值得担心。

以下微基准似乎证实了这一点,尽管微基准并不是那么可靠:

const len = 1e8;
const arr = Array.from({ length: len }, () => Math.random() < 0.5);
setTimeout(() => {
  // Wait for window to load completely and be free of CPU load
  const t0 = performance.now();
  for (let i = 0; i < len; i++) {
    if (!arr[i]) arr[i] = true;
  }
  console.log(performance.now() - t0);
}, 2000);
console.log('timeout set');
Run Code Online (Sandbox Code Playgroud)

const len = 1e8;
const arr = Array.from({ length: len }, () => Math.random() < 0.5);
setTimeout(() => {
  // Wait for window to load completely and be free of CPU load
  const t0 = performance.now();
  for (let i = 0; i < len; i++) {
    arr[i] = true;
  }
  console.log(performance.now() - t0);
}, 2000);
console.log('timeout set');
Run Code Online (Sandbox Code Playgroud)

在我的机器上,条件分配平均需要 500 毫秒左右,而无条件分配平均需要 80 毫秒左右。