MST

星途 面试题库

面试题:JavaScript 复杂算术表达式的性能优化

有这样一段 JavaScript 代码用于计算一系列数值的复杂运算 `let result = 0; for (let i = 0; i < 10000; i++) { result += Math.sqrt(i * i + 2 * i + 1) / (i + 1); }`,请从算术表达式的角度分析这段代码可能存在的性能瓶颈,并给出优化方案,解释优化前后性能差异的原因。
34.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

性能瓶颈分析

  1. 重复计算:在循环中,Math.sqrt(i * i + 2 * i + 1) 部分可以优化。因为 i * i + 2 * i + 1 可以化简为 (i + 1) * (i + 1),即 (i + 1)²,那么 Math.sqrt(i * i + 2 * i + 1) 就等于 i + 1。但原代码每次都进行复杂的乘法和加法运算再开方,这是不必要的重复计算,增加了计算量。
  2. 除法运算:除法运算相对乘法和加法运算在 CPU 层面执行效率稍低,原代码每次循环都执行 (i + 1) / (i + 1) 的除法运算,虽然结果恒为 1,但仍消耗了计算资源。

优化方案

let result = 0;
for (let i = 0; i < 10000; i++) {
    result += 1;
}

这里直接将原复杂表达式化简为 1,因为 Math.sqrt(i * i + 2 * i + 1) / (i + 1) 化简后恒等于 1。

性能差异原因

  1. 优化前:每次循环都要进行乘法、加法、开方以及除法运算,这些运算都需要占用 CPU 时间和资源。随着循环次数增多(10000 次),累计的计算量较大,性能损耗明显。
  2. 优化后:每次循环只进行简单的加法运算,减少了乘法、开方和除法运算的开销。CPU 执行简单加法运算的速度更快,资源消耗更少,因此优化后的代码性能显著提升。