【问题标题】:Speed of the Math Object in JavascriptJavascript 中数学对象的速度
【发布时间】:2016-06-17 22:19:18
【问题描述】:

我正在开发一个 javascript 应用程序,它大量使用数学运算,每次鼠标移动都会调用数十次。我一直在研究其他人的代码作为起点,我经常找到原生 javascript Math 的变通方法,例如...

var pi = Math.PI
var distance = (x * x) + (y * y) / R * R
var pixels = ~~(x/y)

使用 Math 对象是否会对性能造成重大影响?如果是这样,有哪些常见的解决方法?

【问题讨论】:

  • 可能Math 方法是用实现 javascript 的语言(即典型浏览器中的 C 或 C++)实现的,因此它们比您用 Javascript 编写的要快得多
  • 您是否测量性能差异?跨所有目标浏览器?
  • 好吧,Math 没有“距离”方法,整数转换可能更快,但它在语义上也不同于Math.floor()Math.round()。你可以使用 [jsperf](jsperf.com) 来测试这种东西。
  • 您是否遇到性能问题或者这是过早优化的情况?假设前者你做过任何分析吗?
  • @SethCarnegie:当然,如果你正在解释它们。但是现在任何对性能敏感的 JS 都将被编译,因此 x*x 和 Math.pow(x, 2) 在代码生成方面几乎相同。

标签: javascript


【解决方案1】:

如果您出于某种原因在 javascript 中进行计算密集型工作,则必须记住这些事情(*并阅读 David Mandelin 的了解您的引擎:如何使您的 JavaScript 快速演示文稿 - PDF,他更详细地描述了这一点*):

  1. 尽可能内联所有内容。

  2. 函数调用非常昂贵

  3. 对象访问成本很高

  4. 多态性会降低性能,您的变量和参数应始终只包含一种数据类型。

Math 对象并不是特别慢,但无论如何你都不会在那里找到distance() 函数,并且通过Math.method() 调用从闭包中访问它的方法效率很低。

所以sqrt当然比x*x差,自定义random函数可能对你更好,Pi应该被缓存在循环中,minmax应该也应该避免,不知道三角函数和对数的速度。


P.S.:你可以用 ((x >= 0 ? x : -x) + 0.5) >> 0 代替 Math.ceil(Math.abs()),但请记住 - 当我说“密集”时 - 我指的是数字运算、数据处理、物理、图形和类似的东西那。对于普通的 JavaScript 网站或 RIA - 你不应该做我在这里建议的事情。此外,大多数速度黑客都有他们的side effects

【讨论】:

  • 关于第 4 点...我不太明白。您无法避免在 JS 中使用对象进行鸭式输入,因此您无法避免使用对象的多态性。查找就是查找,所以在我看来这与第 3 点相同。
  • 感谢您的提示,仔细阅读,似乎从架构中获得的不仅仅是微优化。我的代码与图形相关,所以我确实需要挤出一点性能。
  • 当人们需要避免昂贵的语言特性时,这些是很好的选择。万一需要避免昂贵的数学调用,这里是我的Benchmark of Elementary Mathematical Operations in Node.js
【解决方案2】:

我不同意函数调用。 if 语句和长专用函数中的 if 语句比具有许多小型通用函数的组织良好的代码要慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2015-07-24
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多