2012-01-13 24 views
3

私はsome testsを実行し、jQuery inArray()のデータポイントは単純なループよりもはるかに低速です。jQueryの配列が遅すぎるのはなぜですか?

array.indexOf()私はこれまでに他のテストを行っていたためテストしていませんでした。さらに悪化しました。

  • なぜそれほど遅いのですか?
  • なぜ単純なループを使用しないのですか?
  • 私が監督しているものはありますか?

これを使用しないための十分な理由である必要がありますあり:何をやっている

for(var i=0,len=arr.length,rtn=-1;i<len;i++){ 
    if(arr[i]==="arritem"){ 
     rtn=i; 
     break; 
    } 
} 
+0

あなたのjsperfテストから: 'return array.indexOf。call(array、elem、i); '???どうして 'return array.indexOf(elem、i);'?なぜ追加のレイヤーが 'コール'を通過するのでしょうか? –

+0

@TJCrowder私はjQueryがそれを使用していると思ったので、http://stackoverflow.com/a/8856637/1148349 – mithril333221

+0

@ mithril333221からコピーしました。http://code.jquery.com/jquery-1.7です。 1.js – ajax333221

答えて

5

あなたはjQueryのinArrayをテストするつもりなら、実際にjQueryのinArrayをテストし、リンゴにリンゴを比較する(あなたはパフォーマンスが非常ある場所でループをインラインで書くことができます  —関数をコールする関数を呼び出します)重要な、それはおそらく、あなたのデフォルトの動きではないでしょう:http://jsperf.com/inarraytest/3

準備HTML:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<script> 

準備コード:

var arr=[0,1,2,3,4,5,6,7,8,9]; 

function arrayLoop(elem, array, i) { 
    var len = array.length; 
    i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 
    for (; i < len; i++) { 
     // Skip accessing in sparse arrays 
     if (i in array && array[ i ] === elem) { 
      return i; 
     } 
    } 
    return -1; 
} 

テスト:

// jQuery.inArray last 
var rtn=jQuery.inArray(9,arr); 

// arrayLoop last 
var rtn = arrayLoop(9,arr); 

// jQuery.inArray middle 
var rtn=jQuery.inArray(4,arr); 

// arrayLoop middle 
var rtn = arrayLoop(4,arr); 

// jQuery.inArray first 
var rtn=jQuery.inArray(0,arr); 

// arrayLoop first 
var rtn = arrayLoop(0,arr); 

indexOfを持っている)クロームの結果は、私たちが最後のエントリを探しているところjQuery.inArrayは、テストケースの最初のペアで(常に速いarrayLoopよりであることです、劇的に so)。 (indexOfを持っていません)IE6の

結果:jQuery.inArrayは我々の場合には、不思議なことに、当然ではないくらい(それは本質的に同じ作業を行う必要があるとして)  —除くことでも、常に速くarrayLoopより配列のの最初のエントリを検索しています。その場合は、はるかに高速です。

+0

jQueryを所有していれば、私が変更する唯一のことは 'indexOf'の使用になります。それは非常に遅いです(なぜ私はなぜ使用しようとしているのかわかりませんそれは可能です)。あなたの時間とテストをありがとう – mithril333221

3

は同じjQueryの$ .inArrayコードのほんの一部であり、あなたが取るとき、もちろん、それがより速くなるでしょう。コードのスニペットとその機能だけをテストしてください。要素を探すために実際にリストを反復する前に、検証されたすべての条件をチェックします。

これは、単純なループと$ .inArray()の間の余分な時間です。

は最後に:あなたは確かに次のことを知っている場合は、単純なループに固執することができ、

  1. 入力は常にあなたの検索を高速化するために、開始インデックスを送るの配列
  2. オプションです。
  3. ネイティブブラウザのindexOf関数の使用。
関連する問題