【问题标题】:Why does native browser sort function work slower than quicksort?为什么原生浏览器排序功能比快速排序慢?
【发布时间】:2014-01-06 02:55:34
【问题描述】:

我实现了快速排序,发现它比原生 .sort() 方法更快,here is the Performance test

为什么以及如何发生这种情况?

【问题讨论】:

  • 我投票决定重新开放。这种差异需要用比反对票更多的东西来解释。话虽如此,这个问题也确实需要将问题和浏览器配对,以便清楚地提出一个重点问题。性能在 IE 10 中是相当的(也就是说,与“慢”的 Chrome 运行大致相同)。
  • 好的。我投票决定重新开放。不过问题可能会好得多......
  • 我认为这里发生了一个有趣的性能现象(在 FF 和 Chrome 中,IE 不关心) - 但这个问题确实需要隔离。
  • 您能否提供更多的测试用例,包括字符数组、字符串、日期等,以显示不同数据上时间排序的变化?

标签: javascript performance sorting quicksort


【解决方案1】:

原因是尽管 .sort() 方法是原生的,但它比快速排序更通用。

sort 方法有一个比较函数。而在快速排序的情况下,比较的类型已经有限。

原生的 sort() 方法在处理更多非常规的比较函数时速度较慢。

另外注意:您应该阅读有关 underscore.js 与 lowdash 的信息。

Lowdash 充满了使用 for 循环而不是原生函数来提高速度的方法。

更新: 我阅读了下面的评论并意识到我的错误。经过一番挖掘,我找到了原生性能变慢的真正原因。本机代码显然是在较低级别的语言中使用的,例如 C,它比 javascript 更不“安全”。

本机函数有许多检查,以确保没有错误并且事情不会中断。 Javascript 代码不需要像 Javascript 那样多的检查,因为它可以帮助您避免许多此类错误。

答案仍然不太令人信服,但与 Array.forEach 相比,来自 lowdash 的 .each 也有类似的结果,低 dash 实现更快。这是因为低破折号实现跳过了 if (... in ....) 检查。由于当今 Javascript 的编译方式,诸如此类的微小差异可以帮助 javascript 变得更快。所有功能在运行之前基本上都转换为本机代码。所以原生优势微乎其微。

【讨论】:

  • 快速排序如何限制比较函数的种类?它采用与本机排序方法相同的通用函数。
【解决方案2】:

你确定native函数实现的是快速排序而不是稳定排序?

好读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2017-07-23
    • 2021-06-19
    • 2018-03-28
    • 2015-06-25
    • 2021-06-06
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多