效能優化 陣列查詢為什麼比煉表快?

2021-10-03 07:12:58 字數 919 閱讀 6447

1、定址操作次數鍊錶要多一些。陣列只需對 [基位址+元素大小*k] 就能找到第k個元素的位址,對其取位址就能獲得該元素。鍊錶要獲得第k個元素,首先要在其第k-1個元素尋找到其next指標偏移,再將next指標作為位址獲得值,這樣就要從第乙個元素找起,多了多步定址操作,當資料量大且其它操作較少時,這就有差距了。

該回答源自:

2、乙個常見的程式設計問題: 遍歷同樣大小的陣列和鍊錶, 哪個比較快? 如果按照大學教科書上的演算法分析方法,你會得出結論,這2者一樣快, 因為時間複雜度都是 o(n)。 但是在實踐中, 這2者卻有極大的差異。 通過下面的分析你會發現, 其實陣列比煉表要快很多。

首先介紹乙個概念:memory hierarchy (儲存層次結構),電腦中存在多種不同的儲存器,如下表

cpu 暫存器 – immediate access (0-1個cpu時鐘週期)

cpu l1 快取 – fast access (3個cpu時鐘週期)

cpu l2 快取 – slightly slower access (10個cpu時鐘週期)

記憶體 (ram) – slow access (100個cpu時鐘週期)

硬碟 (file system) – very slow (10,000,000個cpu時鐘週期)

(資料來自

各級別的儲存器速度差異非常大,cpu暫存器速度是記憶體速度的100倍! 這就是為什麼cpu產商發明了cpu快取。 而這個cpu快取,就是陣列和鍊錶的區別的關鍵所在。

cpu快取會把一片連續的記憶體空間讀入, 因為陣列結構是連續的記憶體位址,所以陣列全部或者部分元素被連續存在cpu快取裡面, 平均讀取每個元素的時間只要3個cpu時鐘週期。 而鍊錶的節點是分散在堆空間裡面的,這時候cpu快取幫不上忙,只能是去讀取記憶體,平均讀取時間需要100個cpu時鐘週期。 這樣算下來,陣列訪問的速度比煉表快33倍! (這裡只是介紹概念,具體的數字因cpu而異)

鍊錶為什麼刪除插入快!陣列為什麼查詢快!

1 它是具有相同資料型的資料,並且有一定的順序,陣列在記憶體中的位址是連續相鄰的。而鍊錶在記憶體中是雜湊存放的。2 cup快取會把一片連續的記憶體空間讀入。因為陣列結構是連續的內村位址,所以陣列全部或者部分元素被連續被存在cpu快取裡面,而鍊錶的節點是分散在堆空間裡面的,這時候cpu快取幫不上忙,只...

從cpu和記憶體來理解為什麼陣列比鍊錶查詢快

1.arraylist和linkedlist可想從名字分析,它們乙個是array 動態陣列 的資料結構,乙個link 鍊錶 的資料結構,此外,它們兩個都是對list介面的實現。前者是陣列佇列,相當於動態陣列 後者為雙向鍊錶結構,也可當作堆疊 佇列 雙端佇列 2.arraylist查詢效率比linkl...

MyISAM查詢速度為什麼比InnoDB快

innodb mylsam兩者引擎所用的索引的資料結構都是b 樹,不過區別在於 mylsam中的b 樹的資料結構儲存的內容是實際資料的位址值,它的索引和實際資料是分開的,只不過使用索引指向實際資料,這種索引的模式被成為非聚集索引。innodb中b 樹的資料結構儲存的都是實際的資料,這種索引稱為聚集索...