2010-09-07 55 views
1

我呈現圍繞3000條記錄,排序的JavaScript得到掛

我用這排序開源腳本,

當我點擊欄,我的瀏覽器中獲取掛很快,

我不能能夠繼續,

有沒有解決這個問題的方法。

link text

+1

你將不得不在你的頁面上發佈實際的代碼。 – Pointy 2010-09-07 15:33:56

回答

3

更新2

我派我的更新上面的代碼的原作者,但直到他決定將它張貼,here is my updated version。如果您決定這麼做,它會加快標準內置排序()的使用。它也用穩定的合併分類取代穩定的雞尾酒分類。合併排序幾乎和在我的測試中使用sort()一樣快。我希望有所幫助。

更新

我不再認爲有瀏覽器之間存在較大的差異,只要內置sort()函數而言。例如,IE8的整體速度遠遠低於Chrome瀏覽器,但我不認爲它只與排序功能有關。我使用一些隨機數據在IE8中進行了一些分析。我發現當列數據是數字或日期時,原始代碼可以得到相當大的改進。將這些數據類型的比較函數中的正則表達式搜索放慢了很多,因爲每次在3000個元素的大約60,000個比較的元素之間進行比較時,它們都會減慢。正則表達式的數量是其兩倍。通過在我們開始分類之前完成所有這些工作,我們可以做到3000個正則表達式,而不是12萬個。這可以節省大約50%的時間。我會稍微將我的更改提交給可排序代碼。

除此之外,大部分時間都是重新排序DOM元素,而不是排序(除非您使用的是振動篩分類)。如果你能找到一個更快的方法來做到這一點,那麼你可以節省一些時間,但我不知道有什麼辦法做到這一點。

原來的答覆:

這裏的問題可能與實際排序做。如果您取消註釋了其中的一些代碼(並註釋了其他一些代碼),那麼您的代碼正在使用振動篩分來獲得穩定的排序。振盪器排序本質上是雙向的氣泡排序。 O(N^2),泡泡排序非常緩慢。如果您沒有取消註釋該代碼,那麼它將使用JavaScript的內置sort()函數以及各種比較函數。這個問題是這個sort()函數是implemented differently in different browsers,所以你可能想看看這個問題是否在某些瀏覽器中發生,而不是在其他瀏覽器中發生。顯然,Webkit代碼仍然使用一個選擇,或者min,排序爲O(N^2)。這幾乎讓我想哭。你用什麼瀏覽器來測試它?

如果排序函數結果是問題,那麼您可以嘗試更改上面的代碼來起訴合併排序或快速排序都是O(N日誌N)。爲了避免O(N^2)的情況,快速排序要稍微複雜一點,所以你可能想要堅持合併排序。此外,合併排序是一個穩定的排序。 This page有一個例子讓你開始合併排序。

0

你的方式回答了你自己的問題。

看看排序腳本。

排序3000條記錄,重新排列DOM並渲染輸出。

這肯定需要時間。

您正在使用的此腳本適用於小型記錄集。

建議:使用服務器端排序並在頁面中呈現結果,每個頁面包含說50條記錄。對於約3000條記錄,您將有大約60頁。

可以說你是第45頁。然後,您啓動一​​個SQL查詢來排序(asc/desc)並跳過第一個44 * 50記錄並檢索下一個50個記錄(對於第45頁)。

+0

如果分頁的手段我不會得到恐懼......對於排序...客戶端說沒有分頁... – Bharanikumar 2010-09-07 16:34:51

+0

那麼你應該改變@Justin建議的排序算法。 – Rahul 2010-09-07 18:11:01

-1

這個庫似乎使用DOM操作進行排序。

最好每次生成表格並使用innerHTML注入表格。
在今天的JavaScript引擎中,這看起來是瞬間的。

即使是IE6也不錯。

這就是說...顯示3000條線給人是有問題的。
但這是另一個辯論;)

+0

不,完全相反。使用'innerHTML'總是比使用DOM慢,特別是在你推薦的情況下。 – 2010-09-07 20:27:38

+0

我想知道什麼樣的測試讓你得出這樣的結論。我喜歡模板引擎,使用innerHTML而不是DOM使它們非常快速。對你的評論完全感到驚訝。 – Mic 2010-09-07 22:33:05