有時候,實現同樣的功能(例如檢索),方法不一樣,可能最後相同的結果所花費的時間卻不一樣。這裡先排除可能是由於不同的演算法導致的結果在時間或者空間複雜度上造成的差異所導致的情況。我們單就資料結構和記憶體本身而言,不同的資料結構,或者簡單明瞭一點,方法體中宣告不同的資料型別,或者同乙個資料型別不同的寫法,都可能導致最終執行時間的不同。
想要了解為什麼會有這樣的區別產生,我們先要了解一下cpu。在這裡我們先不解讀jvm和和os之間的互動,否則又該腰疼了23333333。
簡單的了解過cpu的快取記憶體之後,我們來聊一聊快取定址以及資料儲存。下面我們來結合乙個例子說明一下不同的宣告方式,對計算時間的影響。
//宣告兩個陣列
int x = new
int[100][1];
int y = new
int [1][100];
//進行for迴圈,輸出每個數
for(int i=0;i<100;i++)
}for(int i=0;i<1;i++)
}
我們可以看到,在oop的層面上,這兩個迴圈的時效性並沒有區別,無論怎麼看,這倆個for迴圈的時間複雜度是一樣的。但是如果資料量過大,你就會發現,這兩個迴圈的執行速度並不一樣,後者會快於前者。為什麼呢?
經過了上面的描述,我們可以對cache line有個基本的認識。
可見,對於資料結構的優化,如果不懂得最底層的原理,那優化起來豈不是無從下手?相反,如果對計算機的底層與程式之間的互動原理積累多了,那對於框架的優化而言,更是如虎添翼。功底,還是很重要的嘛。
資料結構那點事 佇列(順序結構)
includeusing namespace std 佇列的順序表現形式於鍊錶的順序的表現形式相同 在佇列中比較重要的是對佇列的空滿的判斷,以及佇列長度的計算 首先,空滿的判斷 1.定義flat,在當為空佇列時,即front rear flat 0 在當為滿佇列時,即front rear flat ...
資料結構那點事 佇列(鏈式結構)
includeusing namespace std typedef int qeueue define ok 1 define error 0 typedef int qelemtype typedef int status 佇列的鏈式結構 在佇列的鏈中,是使用類似於有頭節點的鍊錶,所以在插入,或...
Java資料結構
arraylist 基於 array,在記憶體中占有連續空間,所以get index 時候,根據陣列首位址 偏移量就可以取到值 linklist 基於link,在記憶體中不連續,每個元素只知道下乙個元素,所以get時候,只能從首元素開始乙個乙個去找,效率相對較慢 增加刪除 arraylist 需要變...