用JavaScript加速Math.pow()的选项?

时间:2015-05-06 18:21:47

标签: javascript performance

我有一些代码需要每秒许多Math.pow()函数调用。在测试中,它似乎是代码性能的一个非常大的瓶颈。

结果不需要精确 - 任何高达85%的准确度应该可以正常 - 但我的问题是,有什么方法可以以某种方式加速这些计算?也许以某种精确度为代价?

编辑:这些计算不太可能重复,因此缓存无法正常工作。

2 个答案:

答案 0 :(得分:3)

  

以某种精确度为代价

精度损失多少?如果您只需要2倍的正确答案,则可以使用按位操作。

function pow2(n) {
  return 2 << (n-1);
}

console.log(pow2(n) === Math.pow(2, n));

Number构造函数(包括数字文字)仅使用浮点数。此函数将浮点数转换为32位整数as described here

否则,我怀疑你是否能够击败Math.pow的优化原生实现。

答案 1 :(得分:0)

jsPerf是尝试使用多种技术找到最快技术的绝佳工具。

这可能会因浏览器或操作系统而有所不同,但到目前为止,事实证明Math.pow在我的环境(Chrome 42,64位Linux)中要快得多,直到您打开开发工具。打开开发工具后,根据功率的不同,将数字乘以所需的次数稍快一些,如下例所示:

function pow(num, pow) {
    var result = num;
    while (--pow) {
       result *= num;
    }
    return result;
}

我已经没有不同的想法,但你可以看到我到目前为止所拥有的:

http://jsperf.com/math-pow-alternatives

调用函数(数十万次)也有很多开销。在这种情况下,似乎Math.pow是可行的方法,但可能还有其他方法可以提高性能(或至少可感知的性能)。如果代码阻塞且浏览器遇到一些延迟,您可能会尝试使用Web worker,或限制每帧的计算次数。您还可以尝试减少函数调用的数量,或确保您与DOM的交互非常少(特别是在计算期间,但最好不要)。

如果没有更简洁的代码示例,则很难对代码的性能进行微调。