Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which is faster: Math.abs(value) or value * -1 ?

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?

like image 752
lock Avatar asked Jan 14 '09 04:01

lock


People also ask

What is the value of math abs?

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.

Does abs mean absolute value?

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.

Is math abs double or int?

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.

Is Python slow on abs?

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.


1 Answers

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; 
like image 121
some Avatar answered Oct 11 '22 15:10

some