Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中list.Reverse()的效率?_Javascript_Performance_Optimization_Processing Efficiency - Fatal编程技术网

JavaScript中list.Reverse()的效率?

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毫

有人知道.reverse()在JS中反转对象列表的效率吗

我很好奇,如果将一个列表(比如100个对象)按升序排序并将其反转,而不仅仅是按降序排序,是否会有任何有意义的性能损失

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

  • 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,我不会真正关注这一点,因为这很难衡量,因为它实际上取决于解释器。在谈论时间复杂性时,通常会关注操作的数量。