面试题答案
一键面试性能瓶颈分析
- 重复计算:在循环中,
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
。但原代码每次都进行复杂的乘法和加法运算再开方,这是不必要的重复计算,增加了计算量。 - 除法运算:除法运算相对乘法和加法运算在 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。
性能差异原因
- 优化前:每次循环都要进行乘法、加法、开方以及除法运算,这些运算都需要占用 CPU 时间和资源。随着循环次数增多(10000 次),累计的计算量较大,性能损耗明显。
- 优化后:每次循环只进行简单的加法运算,减少了乘法、开方和除法运算的开销。CPU 执行简单加法运算的速度更快,资源消耗更少,因此优化后的代码性能显著提升。