2016-04-03 9 views
1

jsで配列要素(100k-1kk)を多くソートする必要があります。 多くの可能性があります空白( '')文字列。空の文字列をarray.sort(?)で処理すると、クロムのコールバックが非常に遅くなります。

私は空の値を扱う私のソート機能で

- この値は常に最後.its来るように、[OK]を..私は多くnullまたは未定義または空白を持ってまで(「」)データ

値たとえば、データにヌルが多い場合や空の文字列の場合は、パフォーマンスが低下します。

そして、主なものは、クローム(今49.0.2623.110 mについて、少なくとも最後のバージョン)

のfirefox(45.0.1)非常によく動作します(でもスタンダール場合とでは、このフラグメントが非常に遅いです空のデータなしmy test x10 faster?) クロムとファイアフォックスだけのテスト。

PS私はjsperfは、あなたのコンパレータは常に値のすべてのペアのための論理的な答えを返すことを確実にするためにthat.anyway

https://jsfiddle.net/3h0gtLu2/18/

data = [] 

var i = 0; 

while (i++ <1000){ 

    data.push('' + i) 
} 

while (i++ < 20000){ 

    data.push(''+i ) 

} 

var start = window.performance.now() 
data.sort(function(a,b){ 

    if (a == null || a == undefined) 
         return 1; 
    else if (b == null || b == undefined) 
         return -1; 
    return (parseInt(a) - parseInt(b)); 
}) 

$('#time0').html($('#time0').html() + (window.performance.now() - start)) 


data = [] 

var i = 0; 

while (i++ <1000){ 

    data.push('' + i) 
} 

while (i++ < 20000){ 

    data.push(null ) 

} 

var start = window.performance.now() 
data.sort(function(a,b){ 

    if (a == '' || a === null || a == undefined) 
         return 1; 
    else if (a == '' || b === null || b == undefined) 
         return -1; 
    return (parseInt(a) - parseInt(b)); 
}) 


$('#time1').html($('#time1').html() + (window.performance.now() - start)) 


data = [] 

var i = 0; 

while (i++ <1000){ 

    data.push('' + i) 
} 

while (i++ < 20000){ 

    data.push('' ) 

} 

var start = window.performance.now() 
data.sort(function(a,b){ 

    if (a == null || a == undefined) 
         return 1; 
    else if (b == null || b == undefined) 
         return -1; 
    return (parseInt(a) - parseInt(b)); 
}) 

$('#time2').html($('#time2').html() +(window.performance.now() - start)) 

data = [] 

var i = 0; 

while (i++ <1000){ 

    data.push('' + i) 
} 

while (i++ < 20000){ 

    data.push('' ) 

} 

var start = window.performance.now() 
data.sort(function(a,b){ 

    if (a == '' || a == null || a == undefined) 
         return 1; 
    else if (b == '' || b == null || b == undefined) 
         return -1; 
    return (parseInt(a) - parseInt(b)); 
}) 
$('#time3').html($('#time3').html() +(window.performance.now() - start)) 
+2

コードを投稿しないと、誰も助けることはできません。 – Pointy

+0

残念ながらコードが投稿されました:) –

+0

問題は、並べ替えの比較関数が矛盾しているため、ソートアルゴリズムが狂ってしまうことがあります。同じ2つの値の場合、コンパレータは常に同じ答えを返さなければなりません。 – Pointy

答えて

1

ためのより好ましい知っている、あなたがのためにケースを追加する必要があります両方の値が空の場合:あなたが明示的には必要ありません

data.sort(function(a,b){ 
    var anull = (a == '' || a == null), bnull = (b == '' || b == null); 
    if (anull && bnull) 
    return 0; 
    if (anull) 
    return 1; 
    if (bnull) 
    return -1; 
    return (parseInt(a) - parseInt(b)); 
}) 

注意が両方nullundefinedと比較します。 == nullを比較することは、=== null=== undefinedを比較することとまったく同じです。

私は、両方の値が空のときには(0を返すことによって)そのまま残すことができることを確認して、奇妙なケースで前後することはありません。

もう1つのことは、配列を1回通してすべての空のエントリを単一の値(おそらくnull;問題ではない)に変換し、すべての空でないエントリを実際の数値に変換することです。そうすれば、あなたの並べ替えは、文字列を何度も繰り返して(つまり、すべての呼び出しをparseInt()に)変換する代価を払うことはありません。配列を文字列にする場合は、後続の単一パスで常に配列を文字列に戻すことができます。

+0

ありがとうございます。 –

関連する問題