2013-07-04 51 views
0

比方說,我有以下的JS我的網頁上(compare是問題不相關的一個簡單的比較器功能):爲什麼在Safari中爲了排序jQuery集而不是數組需要更多時間?

function sortArray(a) { 
     a.sort(compare); 
    } 

    function sortJQuerySet(b) { 
     b.sort(compare); 
    } 

    $(document).ready(function(){ 
     var a = [], b = [], i = 0, n = 1000; 

     for(i=0; i<n; ++i) { 
      a.push($('<div>' + i.toString() + '</div>')); 
      b.push($('<div>' + i.toString() + '</div>')); 
     } 

     b = $(b); 

     $('#runner').click(function(){ 
      sortArray(a); 
      sortJQuerySet(b); 
     }); 
    }); 

正如你所看到的,ab在本質上是相同的數組,唯一的區別是b變成jQuery set。我正在嘗試對這兩個數組進行排序並分析排序。請注意,元素的兩個數組數爲1000

下面是在Safari兩個容器排序分析結果: enter image description here

Safari瀏覽器,使約五十萬比較 jQuery的設置與1000個元素。這看起來更像是二次排序,比如O(n log n)排序。與此同時,排序本地數組就很好。

對於兩種容器類型,在Chrome瀏覽器中排序的工作時間大約相等。

P.S.我使用Safari 6.0.4,jQuery 1.7.1和jQuery 1.10.1。 代碼:https://gist.github.com/ikostia/5925715

+1

你的排序函數返回'-1'或'0'每個元素。第二行不對。 – Blender

+0

另外''。text'返回'text'函數,而不是元素的文本。 – Blender

+0

@Blender哦,我明白了。對不起(已經改變)。無論如何,這並不會改變函數本身被稱爲二次次數的事實。 – ikostia

回答

1

或許this discussion關於WebKit引擎可能會流露出一些光芒。

在我看來,從線路: 631如果(thisObj-> CLASSINFO()== & JSArray :: s_info & & asArray(thisObj) - > inSparseMode()!){只有非陣列,或者某種「稀疏」模式下的數組 的排序效率低下。我不確定 稀疏模式是什麼,但讓我們試試我的雷蒙德陳靈感 權力:如果你分配[0] = 1和[1000000] = 2,你不想要1到 999999被存儲,所以像這樣的數組最終會以一個稀疏的 模式結束,其功能更像是一個用整數鍵控的散列表。該 同樣適用於非陣列...

(在上述引文中討論的源代碼是here

現在讓我們來看看在jQuery source code。 調用$(someArrayOrSelectorString)導致調用init方法(第43行)。 init方法返回jQuery.makeArray(selector, this),其中this是jQuery的一個實例(請糾正我,如果我錯了)。 最後,在makeArray方法中調用jQuery.merge(第600行),它將用傳遞的數組元素填充jQuery實例。

所以看起來像包裝一個數組結果的數組類似的對象(jQuery實例),但不是一個真正的數組。而Safari將這個對象視爲稀疏對象。

(您可能會感興趣this answer and comments。這就是我借來的理念,爲我的答案)

相關問題