Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
Array.shift与链表';它在JavaScript中是等效的_Javascript_Arrays_Linked List_Stack_Queue - Fatal编程技术网

Array.shift与链表';它在JavaScript中是等效的

Array.shift与链表';它在JavaScript中是等效的,javascript,arrays,linked-list,stack,queue,Javascript,Arrays,Linked List,Stack,Queue,在JavaScript中实现队列时,有许多选项。一种可能的实现是使用数组,使用Array.push将元素添加到队列中,并使用Array.shift将它们从队列中删除。另一种可能的实现方式是使用链表,将其添加到尾部并从头部移除 通过对堆栈实现的测试,我确定Array.push和Array.pop,无论数组大小,都比向链表尾部添加或删除元素快3-5倍。因此,在JavaScript中,使用链表实现堆栈是没有意义的。但我想知道,在队列的情况下,使用array.shift从数组前面删除元素与从列表前面删除

在JavaScript中实现队列时,有许多选项。一种可能的实现是使用数组,使用Array.push将元素添加到队列中,并使用Array.shift将它们从队列中删除。另一种可能的实现方式是使用链表,将其添加到尾部并从头部移除


通过对堆栈实现的测试,我确定Array.push和Array.pop,无论数组大小,都比向链表尾部添加或删除元素快3-5倍。因此,在JavaScript中,使用链表实现堆栈是没有意义的。但我想知道,在队列的情况下,使用array.shift从数组前面删除元素与从列表前面删除元素在性能上有什么不同?

在Windows 10上的Chrome v63上运行的测试

50000个元素或更少的集合
Array.shift比链表上的等效操作慢38%-40%

超过50000个元素的集合
实际上,Array.shift比链表上的等效操作慢100%

结论和建议
即使在小数组上,Array.shift也比在链表上慢,但如果您只需要在此处或此处执行一些添加或删除操作,那么性能影响可能不足以保证实现链表。跟着数组走。另一方面,如果您有一个超过50k个元素的集合,或者经常添加和删除大量项,那么实现一个链表可能是值得的


有趣的是,V8显然在幕后应用了一些优化,以加快Array.shift的速度,但这种优化似乎只适用于大小为50000或更小的阵列。看看这个基准测试,很明显:

测试运行在ChromeV63和Windows10上

50000个元素或更少的集合
Array.shift比链表上的等效操作慢38%-40%

超过50000个元素的集合
实际上,Array.shift比链表上的等效操作慢100%

结论和建议
即使在小数组上,Array.shift也比在链表上慢,但如果您只需要在此处或此处执行一些添加或删除操作,那么性能影响可能不足以保证实现链表。跟着数组走。另一方面,如果您有一个超过50k个元素的集合,或者经常添加和删除大量项,那么实现一个链表可能是值得的

有趣的是,V8显然在幕后应用了一些优化,以加快Array.shift的速度,但这种优化似乎只适用于大小为50000或更小的阵列。看看这个基准测试,很明显: