Pretty straightforward, but I just want to know which is faster.
I think simply multiplying a number by -1
is much faster than calling a predefined method, provided that you are sure that value is negative.
But if that's the case then what is the abs()
function for? Is it simply for making sure that the value returned would always be positive regardless of value's sign?
The Math. abs() function returns the absolute value of a number. That is, it returns x if x is positive or zero, and the negation of x if x is negative.
The ABS function returns the absolute value of a number. You can think about absolute value as a number's distance from zero on a number line. ABS converts negative numbers to positive numbers.
abs() method returns the absolute (Positive) value of a int value. This method gives the absolute value of the argument. The argument can be int, double, long and float.
It is not that the abs() function is slow; it is calling any function that is 'slow'. Looking up the global name is slower than looking up locals, and then you need to push the current frame on the stack, execute the function, then pop the frame from the stack again.
Updated August, 2012:
I did some profiling with these implementations:
/* Test 1: */ b = Math.abs(a); /* Test 2: */ b = abs(a); //local copy: abs = Math.abs; /* Test 3: */ b = a < 0 ? a * -1 : a; /* Test 4: */ b = a < 0 ? -a : a;
I got the following result on Windows 7. Values are normalized after the fastest result per browser to make it easier to compare which method is faster:
1:Math 2:abs 3:*-1 4:- 1.0= Version Chrome 1.0 1.0 1.0 1.0 111ms 21.0.1180.75 m Firefox 1.0 1.0 1.2 1.2 127ms 14.0.1 IE 1.4 1.0 1.1 1.0 185ms 9.0.8112 Opera 1.9 1.6 1.1 1.0 246ms 12.00 Safari 1.6 1.6 1.1 1.0 308ms 5.1.7
Conclusion: When I did this test 3 years ago, -a was fastest, but now Math.abs(x) is faster in Firefox! In Chrome abs(a)
and -a
got the same time and it was only 3 ms difference to the slowest method when I tested it with 10 000 000 numbers.
My Recommendation: Use Math.abs(a). If you are in a tight loop and by profiling has found it to be too slow, you can use a local reference to the abs function:
var abs=Math.abs; //A local reference to the global Math.abs function for (i=0;i<1234567890;++i) if ( abs( v[i] ) > 10) ++x;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With