排序javascript得到挂起

时间:2010-09-07 15:29:18

标签: javascript sorting

我正在渲染大约3000条记录,

我正在使用这个排序开源脚本

当我点击该列时,我的浏览器很快就会挂起,

我无法继续,

这个问题是否有任何解决方案。

link text

3 个答案:

答案 0 :(得分:3)

更新2

我将更新发送给上述代码的原作者,但在他决定发布之前,here is my updated version。如果您决定这样做,它会加速使用标准的内置sort()。它还以稳定的合并排序取代稳定的鸡尾酒排序。合并排序几乎与在我的测试中使用sort()一样快。我希望有所帮助。

<强>更新

就内置sort()函数而言,我不再认为浏览器之间存在很大差异。例如,虽然IE8比Chrome更慢,但我认为它与排序功能无关。我使用一些随机数据在IE8中进行了一些分析。我发现当列数据是数字或日期时,原始代码可以大大改善。将regexp搜索放在这些数据类型的比较函数中会使事情变慢,因为每次在3000个元素之间进行比较时,它们都会进行大约60,000次比较。正则表达式的数量是其两倍。通过在我们开始排序之前完成所有这些操作,我们做了3000个regexp而不是120,000个。这可以节省大约50%的时间。我会稍微提交对sorttable代码的更改。

除此之外,大部分时间都是重新排序DOM元素,而不是排序(除非您使用的是振动器排序)。如果你能找到一种更快的方法,那么你可以节省一些时间,但我不知道有什么办法。

原始回答:

这里的问题可能与实际排序有关。如果您在那里取消注释了一些代码(并注释掉了一些其他代码),那么您的代码将使用振动器排序来获得稳定的排序。 Shaker sort本质上是一种双向冒泡排序。气泡排序很慢,O(N ^ 2)。如果你没有取消注释该代码,那么它使用javascript的内置sort()函数和各种比较器函数。这个问题的问题是这个sort()函数是implemented differently in different browsers所以你可能想看看这个问题是否发生在某些浏览器中而不是其他浏览器中。显然,Webkit代码仍然使用选择或min,排序为O(N ^ 2)。这几乎让我想哭。你用什么浏览器来测试它?

如果排序功能结果是问题,那么您可以尝试更改上面的代码来起诉合并排序或快速排序,它们都是O(N log N)。 Quicksorts对于避免O(N ^ 2)情况有点棘手,因此您可能希望坚持使用合并排序。此外,合并排序是一种稳定的排序。 This page有一个示例可以帮助您开始合并排序。

答案 1 :(得分:0)

您已经以某种方式回答了自己的问题。

看看排序脚本。

对3000条记录进行排序,重新排列DOM并渲染输出。

肯定需要时间。

您使用的此脚本适用于少量记录。

建议:使用服务器端排序并在页面中呈现结果,每个页面包含50条记录。对于大约3000条记录,您将有大约60页。

让我们说你在第45页。然后启动SQL查询以排序(asc / desc)并跳过前44 * 50条记录并检索接下来的50条记录(第45页)。

答案 2 :(得分:-1)

这个库似乎使用DOM操作来排序。

最好每次生成表并使用innerHTML注入表 在今天的javascript引擎中,这看起来是即时的。

即使IE6也很擅长。

有人说......向人类展示3000条线路是值得怀疑的。
但这是另一场辩论;)