我有一些代码需要每秒许多Math.pow()函数调用。在测试中,它似乎是代码性能的一个非常大的瓶颈。
结果不需要精确 - 任何高达85%的准确度应该可以正常 - 但我的问题是,有什么方法可以以某种方式加速这些计算?也许以某种精确度为代价?
编辑:这些计算不太可能重复,因此缓存无法正常工作。
答案 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的交互非常少(特别是在计算期间,但最好不要)。
如果没有更简洁的代码示例,则很难对代码的性能进行微调。