Javascript中数学对象的速度

Javascript中数学对象的速度,javascript,Javascript,我正在开发一个javascript应用程序,它大量使用数学运算,每次鼠标移动都有几十个调用。我一直在以他人的人员代码为出发点,并且我经常找到本地javascript数学的解决方案,例如 var pi = Math.PI var distance = (x * x) + (y * y) / R * R var pixels = ~~(x/y) 使用Math对象是否会对性能造成重大影响?如果是这样的话,有哪些常见的解决方法?如果你出于某种原因使用javascript做计算密集型的工作,你必须记住这

我正在开发一个javascript应用程序,它大量使用数学运算,每次鼠标移动都有几十个调用。我一直在以他人的人员代码为出发点,并且我经常找到本地javascript数学的解决方案,例如

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

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

如果你出于某种原因使用javascript做计算密集型的工作,你必须记住这些事情(*并阅读David Mandelin的《了解你的引擎:如何使你的javascript快速演示》,他在其中详细描述了这一点*):

  • 尽可能内联所有内容

  • 函数调用非常昂贵

  • 对象访问是昂贵的

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

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

    所以
    sqrt
    当然比
    x*x
    差,自定义
    random
    函数可能更适合您,Pi应该缓存在循环中,
    min
    max
    也应该避免,不知道三角函数和对数速度



    附言:你可以做一些事情,比如,替换
    Math.ceil(Math.abs())
    ,但是记住——当我说“密集型”时——我指的是数字运算、数据处理、物理、图形和类似的东西。对于普通的JavaScript站点或RIA,您不应该做我在这里建议的事情。而且,大多数速度黑客都有他们的

    我不同意函数调用。如果语句中的语句和长的特殊函数比具有许多小的通用函数的有组织代码要慢。

    可能是用代码(JavaScript)在一个典型的浏览器中实现的(即C或C++)的语言实现的。因此,它们比您用Javascript编写的要快得多。您衡量过性能上的差异吗?跨所有目标浏览器?嗯,
    Math
    没有“距离”方法,整数转换可能更快,但在语义上也不同于
    Math.floor()
    Math.round()
    。您可以使用[jsperf](jsperf.com)来测试这类东西。您是否遇到性能问题,或者这是一种过早优化的情况?假设前者你做过分析吗?@SethCarnegie:当然,如果你在解释的话。但是任何对性能敏感的JS现在都将被编译,因此x*x和Math.pow(x,2)在代码生成方面几乎是相同的。。。我真的不明白。您无法避免在JS中使用对象的duck类型,因此无法避免对象的多态性。查找就是查找,所以在我看来这和第3点是一样的。谢谢你的提示,我仔细研究了一下,似乎从架构中获得的不仅仅是微观优化。我的代码是与图形相关的,所以我确实需要挤出一点性能。当需要避免语言的昂贵功能时,这些都是好的方面。如果你需要避免昂贵的数学电话,这里是我的起点。