【问题标题】:Javascript performance when reassigning a value to a variable将值重新分配给变量时的 Javascript 性能
【发布时间】:2020-09-19 02:24:39
【问题描述】:

我有一个原本为假的布尔值。但是在未来的某个时候,如果它的值改变(可以改变多次,但只能改变相同)就会成立。

例如,使用给定的伪代码

const hasChanged = false; // stateful

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

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

const handleSubmit = () => {
   // ...
   !hasChanged && hasChanged = true;
   // ...
}

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

有什么想法吗?

【问题讨论】:

  • 这感觉一般你根本不需要担心,只要它不是 getter/setter 方法,你就不会增加任何额外的开销。然而,检查确实增加了更多开销,因为 JS 是 JIT 编译的,这意味着它需要 - 从技术上讲 - 编译更多代码。只需分配变量,因为从内存中获取和检查可能是更长的操作。以 teeny meeny mini 的幅度。以至于牺牲代码的可读性可能是不值得的。

标签: javascript performance


【解决方案1】:

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

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

这与著名问题背后的推理相同:Why is processing a sorted array faster than processing an unsorted array?

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

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

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');

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');

在我的机器上,条件赋值平均需要 500ms 左右,而无条件赋值平均需要 80ms 左右。

【讨论】:

  • 我喜欢这句话。我完全同意,可能根本不是的瓶颈。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2022-01-11
相关资源
最近更新 更多