循环的优化
- 避免使用 for-in 循环,除非你需要遍历一个属性数量未知的对象。
- 改善循环性能的最佳方式是减少每次迭代的运算量和减少循环迭代次数。
- 减少对象成员及数组项的查找次数。
比如:
// 优化前
for (var i = 0; i < items.length; i++) {
process(items[i]);
}
// 优化后
for (var i = 0, len = items.length; i < len; i++) {
process(items[i]);
}
- 颠倒数组的顺序来提高循环性能。在 JavaScript 中,倒序循环回略微提升性能。
当循环复杂度为 O(n) 时,减少每次迭代的工作量是最有效的方法。当复杂度大于 O(n),建议着重减少迭代次数。
条件语句的优化
- 大多数情况下 switch 比 if-else 运行得要快,但只有当条件数量很大时才快得明显。
- if-else 的优化:确保最可能出现的条件放在首位。
- if-else 的优化:阻止成一系列嵌套的 if-else 语句 ```javascript // 优化前 if (value == 0) { return result0; } else if (value == 1) { return result1; } else if (value == 2) { return result2; } else if (value == 3) { return result3; } else if (value == 4) { return result4; } else if (value == 5) { return result5; } else if (value == 6) { return result6; } else if (value == 7) { return result7; } else if (value == 8) { return result8; } else if (value == 9) { return result9; } else { return result10; }
// 优化后,使用二分法 if (value < 6) { if (value < 3) { if (value == 0) { return result0; } else if (value == 1) { return result1; } else { return result2; } } else { if (value == 3) { return result3; } else if (value == 4) { return result4; } else { return result5; } } } else { if (value < 8) { if (value == 6) { return result6; } else { return result7; } } else { if (value == 8) { return result8; } else if (value == 9) { return result9; } else { return result10; } } } ```
- 当有大量离散值需要测试时,可以使用查找表。
递归的优化
最常见的导致栈溢出的原因是不正确的终止条件,因此定位模式错误的第一步是验证终止条件。如果终止条件没问题,那么可能是算法中包含了太多层递归,为了能在浏览器中安全地工作,建议改成迭代、Memoization,或者结合两者使用。
递归:就是在运行的过程中调用自己。
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
迭代是一种不断用变量的旧值递推新值的过程。
把递归算法改用迭代实现是避免栈溢出错误的方法之一。
Memoization:一种避免重复工作的方法,它缓存前一个计算结果供后续计算使用,避免了重复工作。