很簡單,但我只想知道哪個更快。哪一個更快:Math.abs(value)或value * -1?
我認爲只要乘以-1
就比調用預定義的方法快得多,前提是您確定該值爲負值。
但是,如果是這種情況,abs()
函數是什麼?僅僅是爲了確保返回的值總是正值,而不管值的符號如何?
很簡單,但我只想知道哪個更快。哪一個更快:Math.abs(value)或value * -1?
我認爲只要乘以-1
就比調用預定義的方法快得多,前提是您確定該值爲負值。
但是,如果是這種情況,abs()
函數是什麼?僅僅是爲了確保返回的值總是正值,而不管值的符號如何?
更新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;
我想這取決於執行,但Math.abs
可能是那樣簡單:
function abs(x) {
return x < 0 ? x * -1 : x;
}
所以,從理論上講,它只是增加了一個快速測試乘以之前。
但是,是的,否定負號是唯一目的。問題是,一個簡單的x * -1
也會對正值產生反作用。
@olliej [評論]
真。儘管簡單的編輯。 ;)
function abs(x) {
return Number(x < 0 ? x * -1 : x);
}
我會建議選擇更清楚地顯示您的意圖,而不是擔心表現的方法。在這種情況下,乘以-1的性能增益可能是最小的。
當您使用Math.abs()
時,很顯然您需要一個正值。當您使用* -1
時,它不清楚,並且需要更多調查來確定輸入值是否總是負值。
就在*-1
操作可能更快,但要記住的是,最終結果與math.abs()的結果不同。
math.abs(-5)
和math.abs(5)
都返回5.
-5 * -1
返回5爲好。
5 * -1
返回-5。
所以除非你確定這個數字是否定的,否則你必須做一些測試,這會花費更多的時間。不妨做math.abs()。
但實際上,如果abs()和* -1之間的性能差異在JS中很重要,那麼您可能會遇到更嚴重的問題。
風格問題:爲什麼用a * -1
而不是-a
? 除此之外,我同意你應該使用abs()
,如果你事先不知道數字的符號。我不會在乎速度,但爲了可讀性。
事實上,使用-x而不是x * -1可能會更快。 – Prestaul 2009-01-14 04:55:53
爲未來的人快速回答:[既不,真的]。(http://jsperf.com/abs-vs-n1) – Tortoise 2012-11-05 03:24:51
..無論你使用自定義函數:http://jsperf.com/math -abs-vs-custom-abs-function其中`Math.abs()`大大勝於其他任何東西。根據這個測試 – h2ooooooo 2012-11-16 15:16:35