MST

星途 面试题库

面试题:JavaScript 表达式优化之复杂计算

给定一个复杂的数学计算表达式 `let num1 = 10; let num2 = 20; let num3 = 30; let complexResult = (num1 * num2 + num2 / num3 - Math.pow(num1, num3)) / (num1 + num2 - num3);` 假设这段代码在性能敏感的场景下频繁执行,如何对这个表达式进行优化以提升性能,阐述优化步骤及原理。
46.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 预计算部分值
    • 对于 Math.pow(num1, num3),这是一个相对复杂的操作。可以提前计算 Math.pow(10, 30),将其结果缓存起来。因为在频繁执行时,num1num3 的值不变,每次都计算 Math.pow(num1, num3) 是浪费性能的。
    • 例如:
    let num1 = 10;
    let num2 = 20;
    let num3 = 30;
    let powResult = Math.pow(num1, num3);
    let complexResult = (num1 * num2 + num2 / num3 - powResult) / (num1 + num2 - num3);
    
    • 原理:减少了复杂函数(Math.pow)的调用次数,直接使用预计算的值,提高了执行效率。
  2. 按优先级逐步计算并缓存中间结果
    • 先计算乘除部分:
      • 计算 num1 * num2num2 / num3 并缓存结果。
      • 例如:
      let num1 = 10;
      let num2 = 20;
      let num3 = 30;
      let multiplyResult = num1 * num2;
      let divideResult = num2 / num3;
      let powResult = Math.pow(num1, num3);
      let numerator = multiplyResult + divideResult - powResult;
      let denominator = num1 + num2 - num3;
      let complexResult = numerator / denominator;
      
    • 原理:通过缓存中间结果,避免了在整个表达式中重复计算相同的子表达式,减少了计算量。
  3. 使用更高效的数据类型(如果适用)
    • 如果 num1num2num3 的值范围固定且较小,可以考虑使用 Int8ArrayUint8Array 等更紧凑的数据类型(假设环境支持且适用于该场景)。但在 JavaScript 中,基本数字类型(number)是双精度浮点数,在一般情况下转换数据类型可能带来更多开销,不过在某些特定环境或对内存使用极为敏感的场景下可能有效。
    • 原理:更紧凑的数据类型占用更少的内存,在频繁计算时可能会提高内存访问效率。