[英]Why use Lists, when Arrays are faster?
我注意到Arrays的執行速度遠遠超過Haxe的鏈接列表(至少在cpp上)。 我得到的結果如下。
Main.hx:40: With 1 items, Array is 14% faster than List.
Main.hx:40: With 5 items, Array is 58% faster than List.
Main.hx:40: With 10 items, Array is 59% faster than List.
Main.hx:40: With 100 items, Array is 54% faster than List.
Main.hx:40: With 1000 items, Array is 56% faster than List.
Main.hx:40: With 10000 items, Array is 55% faster than List.
Main.hx:40: With 100000 items, Array is 52% faster than List.
這讓我感到尷尬。 盡管Array必須不斷復制項目,但Array怎么能這么快? 為什么甚至使用Lists呢?
package tests;
import haxe.Timer;
class Main
{
static function main()
{
var arr:Array<Int> = new Array();
var list:List<Int> = new List();
var result = new List();
for (items in [1, 5, 10, 100, 1000, 10000, 100000]) {
var listtime = timeit(10000, function() {
for (i in 0...items)
list.add(i);
for (x in list)
result.add(x);
result.clear();
list = new List();
});
var arrtime = timeit(10000, function() {
for (i in 0...items)
arr.push(i);
for (x in arr)
result.add(x);
result.clear();
arr = new Array();
});
if (arrtime < listtime)
trace('With $items items, Array is ${Std.int((1-arrtime/listtime)*100)}% faster than List.');
else
trace('With $items items, List is ${Std.int((1-listtime/arrtime)*100)}% faster than Array.');
}
}
static public function timeit<T>(times:Int, f:Void -> T):Float {
var start = Timer.stamp();
for (i in 0...times) {
f();
}
var time = Timer.stamp() - start;
return time;
}
}
盡管Array必須不斷復制項目,但Array怎么能這么快?
對於線性處理,數組更快,因為數組內容連續存儲在內存中。 當您以線性方式訪問內存時,會同時將多個對象提取到處理器緩存中。 另一方面,鏈接列表節點分散在整個存儲器中,因此線性處理它們會導致主存儲器中的更多訪問。 讀取緩存比讀取主存儲器要快得多。
為什么甚至使用Lists呢?
使用鏈表的一個主要原因是插入新元素或刪除現有元素不會使鏈接列表中其他元素的引用(包括迭代器和指針)無效。 陣列不能有這樣的保證。
當陣列速度更快時,為什么要使用列表?
更快的是什么? 鏈接列表在其他人之間插入元素或刪除列表中間的元素時通常要快得多。 使用數組(至少是C風格的數組)在位置i
處插入或刪除需要在i
之后移動每個元素。 使用鏈接列表,您只需要更改幾個指針。
再次嘗試測試,但不要將元素推到列表的末尾,而是在開頭插入它們。
有一篇文章廣泛討論了這個問題:
https://github.com/delahee/haxe.opt/blob/master/list_vs_array.md
TLDR:這取決於你的用例,但在某些情況下,列表肯定會更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.