Math.pow 是不是比使用临时分配的乘法更昂贵?

Posted

技术标签:

【中文标题】Math.pow 是不是比使用临时分配的乘法更昂贵?【英文标题】:Is Math.pow more expensive than multiplication using temporary assignments?Math.pow 是否比使用临时分配的乘法更昂贵? 【发布时间】:2013-08-22 14:13:31 【问题描述】:

在将 javascript 库移植到 Python 时,我发现了这段代码:

return Math.atan2(
    Math.sqrt(
       (_ = cosφ1 * sinΔλ) * _ + (_ = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * _
    ), 
    sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ
);

我错了还是(_ = cosφ1 * sinΔλ) * _ 可以写成Math.pow(cosφ1 * sinΔλ, 2)

我猜作者试图避免使用 Math.pow,与临时分配相比,这在 javascript 中是否昂贵?

[更新]

截至 2016 年底,Chrome 53.0(64 位)的差异似乎没有以前那么大了。

【问题讨论】:

为什么不试试jsperf 并告诉我们。 @atomman:很高兴了解 jsperf,谢谢 jsben.ch/#/lhQpz 在这里查看 【参考方案1】:

我能想到的唯一原因是性能。首先让我们测试一下他们是否真的做同样的事情并且我们没有忽略什么。

var test = (test = 5 * 2) * test; // 100
Math.pow(5 * 2, 2); // 100

正如预期的那样,事实证明这也是如此。现在让我们看看他们使用jsperf是否有不同的表现。在这里查看:http://jsperf.com/...num-self

Firefox 23 的差异非常很小,但对于 Safari,差异要大得多。在那里使用Math.pow 似乎更昂贵。

【讨论】:

很高兴知道 jsperf,我不知道如何分析 javascript。易读性牺牲可能是值得的,因为它来自一个距离函数,将应用于可能很长的数组。 @PauloScardine 如果您打算经常使用它,那就搞砸易读性。您可以随时添加 cmets 来解释该行代码的作用。在我得到它之前我必须阅读它。 这段代码来自 D3 名人的 Mike Bostock,它远远超出了我的魔法水平。感谢你的回答。 :-) 这与exp 相比如何?

以上是关于Math.pow 是不是比使用临时分配的乘法更昂贵?的主要内容,如果未能解决你的问题,请参考以下文章

charAt() 和 Math.pow()

为啥在 Windows 上创建新进程比在 Linux 上更昂贵?

python函数深入浅出 11.math.pow()及其相关函数详解

指数运算符 ^ 和 Math.pow() 之间的区别

Python问题 pow(x,y)和math pow(x,y的区别?

为啥 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?