I'm working on a javascript application that makes intensive use of math operations, dozens of calls per mouse move. I've been working on others' people code as a starting point, and I often find work arounds for the native javascript Math, such as...
var pi = Math.PI
var distance = (x * x) + (y * y) / R * R
var pixels = ~~(x/y)
Is there a significant performance hit for using the Math object? If so, what are some common workarounds?
I'm working on a javascript application that makes intensive use of math operations, dozens of calls per mouse move. I've been working on others' people code as a starting point, and I often find work arounds for the native javascript Math, such as...
var pi = Math.PI
var distance = (x * x) + (y * y) / R * R
var pixels = ~~(x/y)
Is there a significant performance hit for using the Math object? If so, what are some common workarounds?
Share Improve this question asked Jan 16, 2012 at 19:35 methodofactionmethodofaction 72.4k22 gold badges158 silver badges167 bronze badges 6 | Show 1 more comment2 Answers
Reset to default 17If you are for some reason doing computing intensive stuff in javascript, you must remember those things (*and read David Mandelin's Know Your Engines: How to Make Your JavaScript Fast presentation - PDF, where he describes this in more details*):
inline everything you can.
function calls are very expensive
object access is expensive
polymorphism can cost you performance, your variables and arguments should always hold only one data type.
Math object is not especially slow, but you will not find distance()
function there anyway, and accessing its methods from closure via Math.method()
calls is, inefficient.
so sqrt
is, of course, worse than x*x
, custom random
function might be better for you, Pi should be cached in loops, min
and max
should probably be avoided as well, no idea about trigonometry and logarithms speed.
P.S.: You can do things like ((x >= 0 ? x : -x) + 0.5) >> 0
, to replace Math.ceil(Math.abs())
, but remember - when i say "intensive" - i'm talking about number crunching, data processing, physics, graphics and things like that. For normal JavaScript sites or RIAs - you should not do stuff i am suggesting here. Also, most of the speed hacks have their side effects
I do not agree on the function calls. if statements inside if statements and long specialised functions is slower than well organised code with many small generalised functions.
Math
methods are implemented in the language that javascript is implemented in (i.e. C or C++ in a typical browser) so they are much faster than what you can write in Javascript – Seth Carnegie Commented Jan 16, 2012 at 19:38Math
doesn't have a "distance" method, and that integer conversion might be faster but it's also semantically different thanMath.floor()
orMath.round()
. You can use [jsperf](jsperf.com) to test this sort of thing. – Pointy Commented Jan 16, 2012 at 19:39