2009-01-14 121 views
32

很簡單,但我只想知道哪個更快。哪一個更快:Math.abs(value)或value * -1?

我認爲只要乘以-1就比調用預定義的方法快得多,前提是您確定該值爲負值。

但是,如果是這種情況,abs()函數是什麼?僅僅是爲了確保返回的值總是正值,而不管值的符號如何?

+5

事實上,使用-x而不是x * -1可能會更快。 – Prestaul 2009-01-14 04:55:53

+2

爲未來的人快速回答:[既不,真的]。(http://jsperf.com/abs-vs-n1) – Tortoise 2012-11-05 03:24:51

+1

..無論你使用自定義函數:http://jsperf.com/math -abs-vs-custom-abs-function其中`Math.abs()`大大勝於其他任何東西。根據這個測試 – h2ooooooo 2012-11-16 15:16:35

回答

65

更新2012年8月

我做了一些分析與這些實現:

/* 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; 

我得到了在Windows下面的結果7.價值觀是每個瀏覽器最快的結果後歸以便於比較哪種方法更快:

 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 

結論: 3年前我做了這個測試時,-a是最快的,但現在Math.abs(x)在Firefox中速度更快!在Chrome中,abs(a)-a得到了同樣的時間,當我用10萬個數字測試時,它與最慢的方法只有3毫秒的差別。

我的建議:使用Math.abs(a)。如果你是在一個緊湊的循環,並通過分析發現它是太慢了,你可以使用本地參考ABS功能:

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; 
10

我想這取決於執行,但Math.abs可能是那樣簡單:

function abs(x) { 
    return x < 0 ? x * -1 : x; 
} 

所以,從理論上講,它只是增加了一個快速測試乘以之前。

但是,是的,否定負號是唯一目的。問題是,一個簡單的x * -1也會對正值產生反作用。


@olliej [評論]

真。儘管簡單的編輯。 ;)

function abs(x) { 
    return Number(x < 0 ? x * -1 : x); 
} 
22

我會建議選擇更清楚地顯示您的意圖,而不是擔心表現的方法。在這種情況下,乘以-1的性能增益可能是最小的。

當您使用Math.abs()時,很顯然您需要一個正值。當您使用* -1時,它不清楚,並且需要更多調查來確定輸入值是否總是負值。

3

就在*-1操作可能更快,但要記住的是,最終結果與math.abs()的結果不同

math.abs(-5)math.abs(5)都返回5.

-5 * -1返回5爲好。

5 * -1返回-5。

所以除非你確定這個數字是否定的,否則你必須做一些測試,這會花費更多的時間。不妨做math.abs()。

但實際上,如果abs()和* -1之間的性能差異在JS中很重要,那麼您可能會遇到更嚴重的問題。

1

風格問題:爲什麼用a * -1而不是-a? 除此之外,我同意你應該使用abs(),如果你事先不知道數字的符號。我不會在乎速度,但爲了可讀性。

相關問題