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

前端 未结 5 1822
天涯浪人
天涯浪人 2020-12-25 11:24

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 meth

5条回答
  •  南笙
    南笙 (楼主)
    2020-12-25 12:05

    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;
    

提交回复
热议问题