2017-12-09 13 views
1

私は9つのランダムな整数を持っています。明示的にすべてを比較せずに最大値を見つける方法がより速いのですか?最大9つの数字を見つける - 高速

私はこの操作を1フレームあたり何回行うのですか?これはかなり遅いです。

function calculateMax(a, b, c, 
         d, e, f, 
         g, h, i){ 
    var max = (a > b) ? a : b; 
    var max2 = (c > d) ? c : d; 
    var max3 = (e > f) ? e : f; 
    var max4 = (g > h) ? g : h; 

    max = (i > max) ? i : max; 
    max = (max2 > max) ? max2 : max; 
    max = (max3 > max) ? max3 : max; 
    max = (max4 > max) ? max4 : max; 

    return max; 
} 
+0

は、私はあなたがチェックする必要があるとして、すべての値は、それがn-1せずに、n個の数の最大数を見つけることは不可能だ最大数 – vibhor1997a

+0

を伝える 'O'未満(N)との最大を見つけることができるとは思いません比較とn-1課題までボトルネックはJavaScriptです。 Yuk。 – nicomp

+0

'var num = [99、4、300、55]; Math.max.apply(null、num) ' – zer00ne

答えて

2

The results seem rather disappointing after running few timesが、投稿SIMD instructionsでもっと速いかもしれません)

function max1(a, b, c, d, e, f, g, h, i) {     // shortened calculateMax 
 
    var max = (a > b) ? a : b; var max2 = (c > d) ? c : d; 
 
    var max3 = (e > f) ? e : f; var max4 = (g > h) ? g : h; 
 

 
    max = (i > max) ? i : max; max = (max2 > max) ? max2 : max; 
 
    max = (max3 > max) ? max3 : max; max = (max4 > max) ? max4 : max; 
 
    return max; 
 
} 
 

 
function max2(a, b, c, d, e, f, g, h, i) { 
 
    if (a < b) a = b; if (a < c) a = c; if (a < d) a = d; if (a < e) a = e; 
 
    if (a < f) a = f; if (a < g) a = g; if (a < h) a = h; if (a < i) a = i; 
 
    return a; 
 
} 
 

 
//function max(a, b) { return a - ((a -= b) & (a >> 31)); } 
 
//function max(a, b) { return (a - b >>> 31) * b | (b - a >>> 31) * a } 
 
function max(a, b) { return (a - b >> 31) & b | (b - a >> 31) & a } 
 

 
function max3(a, b, c, d, e, f, g, h, i) { 
 
    return max(a, max(b, max(c, max(d, max(e, max(f, max(g, max(h, i)))))))) 
 
} 
 

 
function max4(a, b, c, d, e, f, g, h, i) { 
 
    a = (a - b >> 31) & b | (b - a >> 31) & a 
 
    a = (a - c >> 31) & c | (c - a >> 31) & a 
 
    a = (a - d >> 31) & d | (d - a >> 31) & a 
 
    a = (a - e >> 31) & e | (e - a >> 31) & a 
 
    a = (a - f >> 31) & f | (f - a >> 31) & a 
 
    a = (a - g >> 31) & g | (g - a >> 31) & a 
 
    a = (a - h >> 31) & h | (h - a >> 31) & a 
 
    return (a - i >> 31) & i | (i - a >> 31) & a 
 
} 
 

 
var l = console.log, p = performance 
 
var t = p.now(), m = max1(1,2,3,4,5,6,7,8,9); t -= p.now(); l(m, 1, -t) 
 
var t = p.now(), m = max2(1,2,3,4,5,6,7,8,9); t -= p.now(); l(m, 2, -t) 
 
var t = p.now(), m = max3(1,2,3,4,5,6,7,8,9); t -= p.now(); l(m, 3, -t) 
 
var t = p.now(), m = max4(1,2,3,4,5,6,7,8,9); t -= p.now(); l(m, 4, -t)

+0

あなたがリンクしたパフォーマンステストは、さまざまな入力で期待されるパフォーマンスについて多くのことを教えてくれませんこれらのテストの関数引数は定数のリテラルなので、JavaScriptエンジンは実世界のシナリオよりも積極的に最適化します。 –

2

最良の方法は、ネイティブ実装を使用することです:

Array.max = function(array){ 
    return Math.max.apply(Math, array); 
}; 

console.log(Array.max([1,2,9,8,3,2,1,2,5])); // 9 

CF:誰かが他のブラウザ上で、より良いテストを行う、または(改善したい場合にはhttps://johnresig.com/blog/fast-javascript-maxmin/

+0

[これらのことを常にテストする価値がある](https://jsperf.com/fast-max-for-so-question)上記の不要な配列の作成を避ける場合でも、ChromeとIE11 'Math.max'を直接使うのはOPの関数よりも遅い*です。 (これはFirefox上でははるかに高速ですが、あなたが上記のように配列を作成して追加するのではなく)。 –

+0

@TJCrowder興味深いことに、Firefoxの組み込み 'Math.max'の利点は、定数。 FirefoxのIonMonkeyは、組み込み関数へのこのような「定数」呼び出しを最適化しますか? –

+0

@le_m:私は[それを観察しない](https://jsperf.com/fast-max-for-so-question)。 –

関連する問題