JavaScript中list.Reverse()的效率?
有人知道.reverse()在JS中反转对象列表的效率吗 我很好奇,如果将一个列表(比如100个对象)按升序排序并将其反转,而不仅仅是按降序排序,是否会有任何有意义的性能损失 编辑: 因此,我运行了一些测试,对数组进行降序排序,然后反向升序。结果非常有趣: (在铬中运行)JavaScript中list.Reverse()的效率?,javascript,performance,optimization,processing-efficiency,Javascript,Performance,Optimization,Processing Efficiency,有人知道.reverse()在JS中反转对象列表的效率吗 我很好奇,如果将一个列表(比如100个对象)按升序排序并将其反转,而不仅仅是按降序排序,是否会有任何有意义的性能损失 编辑: 因此,我运行了一些测试,对数组进行降序排序,然后反向升序。结果非常有趣: (在铬中运行) 1000项随机排序,降序正常排序,10000次试验:0.3681毫秒 以随机顺序排列1000项,升序排序,然后反向排序,10000次试验:0.3651毫秒 1000项按升序排列,正常降序排列,10000次试验:0.0282毫
- 1000项随机排序,降序正常排序,10000次试验:0.3681毫秒
- 以随机顺序排列1000项,升序排序,然后反向排序,10000次试验:0.3651毫秒
- 1000项按升序排列,正常降序排列,10000次试验:0.0282毫秒
- 以升序排列1000个项目,升序排序,然后反向排列,10000次试验:0.0247毫秒
似乎.reverse()不是一个非常昂贵的操作,尤其是与sort相比。Ecma规范对
数组#sort
是模糊的,因此答案取决于实际实现,假设我们讨论的是V8
(Chrome,NodeJS),然后我们可以说,对于包含>10个元素的列表,时间复杂度是O(n log(n))
,而数组的时间复杂度是O(n)
有鉴于此,我们可以自信地说,直接按降序排序会更好,因为排序+反向
显然比仅排序
更昂贵
按降序排序等于按升序排序。
更新:正如Jonas在下面的评论中所述,如果您能注意到列表上的模式(例如,列表已经是asc排序的),那么您可能只需将其反转并保存一个O(n log(n))
操作。试图理解数据的形状始终是性能优化的第一步。在O(n)中起作用,这从链接的规范中可以明显看出。它将成对交换元素
回答您的问题:sort+reverse
不可避免地比单独的sort
更昂贵,没有捷径可走(可能与双链接列表或其他一些数据结构一样)。reverse只需要O(n),所以最好按照您希望它们出现的顺序进行排序(在你的例子中是递减的)反转100个元素的数组所需的时间完全可以忽略不计,除非是在最敏感的应用程序中。即使是这种情况,也需要O(n)来完成(遍历每个节点并交换下一个和上一个指针)。你几乎无法逃脱O(n)对于反向,除非你使用一个奇怪的数据结构,否则我认为你是在过早地优化。唯一确定的答案是:创建一个测试用例,将你的数据放在你的设备上,运行几千次并测量所需的时间。嗯。如果数组已经按升序排序了呢?那么排序+反向可能会更快…还要注意,自定义排序使用用户区回调的执行速度比纯C操作慢得多,比如reverse()。@jonaswillms great point.dandavis,我不会真正关注这一点,因为这很难衡量,因为它实际上取决于解释器。在谈论时间复杂性时,通常会关注操作的数量。