【问题标题】:Efficiency of list.Reverse() in JavaScript?JavaScript 中 list.Reverse() 的效率?
【发布时间】:2019-08-13 21:32:09
【问题描述】:

有谁知道 .reverse() 在 JS 中用于反转对象列表的效率如何?

我很好奇按升序对列表(例如 100 个对象)进行排序和反转它而不是仅按降序排序列表是否会有任何有意义的性能损失。

编辑: 所以我进行了一些测试,对数组进行降序排序,然后逆序升序。结果非常有趣: (在铬中运行)

  • 1000 项随机排序,降序正常排序,10000 次试验:0.3681 毫秒
  • 1000 项随机排序,升序倒序,10000 次试验:0.3651 毫秒
  • 1000项升序,正常降序,10000次试验:0.0282 ms
  • 1000 项升序,升序倒序,10000 次试验:0.0247 毫秒

似乎 .reverse() 不是一个非常昂贵的操作,尤其是与排序相比时。

【问题讨论】:

  • Reverse 将花费 O(n),微不足道,因此最好按照您希望它们出现的顺序对其进行排序(在您的情况下为降序)
  • reverse() 包含 100 个元素的数组的时间完全可以忽略不计,除非在最敏感的应用程序中。
  • 即使是这种情况,它仍然需要 O(n) 来完成(遍历每个节点并交换 next 和 prev 指针)。你几乎无法逃避 O(n) 进行反向,除非你使用奇怪的数据结构
  • 我认为你过早地优化了。
  • 唯一确定的答案是:创建一个测试用例,在您的设备上使用您的数据,运行几千次并测量它所花费的时间。

标签: javascript performance optimization processing-efficiency


【解决方案1】:

Ecma 规范对Array#sort 含糊其辞,所以答案取决于实际实现,假设我们在谈论V8(Chrome、NodeJS),那么我们可以说对于带有>10 元素的列表的时间复杂度是O(n log(n)),而Array#reverse的时间复杂度是O(n)

鉴于此,我们可以自信地说直接按降序排序会更好,因为sort + reverse 显然比sort 更昂贵。

降序排序等于升序排序。


更新:正如 Jonas 在下面的评论中所说,如果您可以注意到列表中的模式(例如列表已经按 asc 排序),那么您可能只需将其反转并保存O(n log(n)) 操作。尝试了解数据的形状始终是性能优化的第一步。

【讨论】:

  • 嗯。如果数组已经升序排序怎么办?那么 sort + reverse 可能会更快......
  • 还请注意,使用用户级回调的自定义排序比纯 C 操作(如 reverse())慢得多。
  • @JonasWilms 很重要。 dandavis,我不会真正关注这一点,因为它很难衡量,因为它真的取决于口译员。在谈论时间复杂度时,您通常会关注操作的数量。
【解决方案2】:

.reverse() 在 O(n) 中工作,这从链接的规范中可以看出。它将对元素进行成对交换。

回答您的问题:sort + reverse 不可避免地比单独的sort 更昂贵,没有捷径可走(可能是双向链表或其他一些数据结构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多