下面這個**用兩個雙層迴圈遍歷了乙個二維陣列裡所有的元素,以我自己機器的測試 上面那個迴圈耗時基本為下面的一半,兩個迴圈的時間複雜度相同,為什麼會有這麼大的差別?
首先要明白的是不管是幾維陣列,他們都是用一塊位址連續的記憶體來儲存所有的元素,而記憶體布局的順序是一整行接著下乙個整行排列,第乙個迴圈是一行一行訪問,所以從記憶體上看是順序的遍歷了這塊記憶體,每次讀取的位置都在上一次的附近,所以cache命中率高。第二個迴圈是一列一列訪問,可以說訪問的元素都不是連續的記憶體訪問(相隔了一行的大小),從而降低了cache的命中率。
cache的命中率對多層迴圈的影響是最明顯的,因此在設計迴圈邏輯的時候,如果有某個資料結構需要多次訪問,盡量讓其全部在最裡層中完成訪問,提高cache對其的命中率。
#include #includeintmain()
struct
timeval time1, time2;
inti, j;
gettimeofday(&time1, 0
);
for(j = 0; j < lie; j++)
}gettimeofday(&time2, 0
); printf(
"time %f\n
", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000);
gettimeofday(&time1, 0
);
for(i = 0; i < hang; i++)
}gettimeofday(&time2, 0
); printf(
"time %f\n
", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000);
return0;
}
高效程式設計之原則
前言 清明時節雨紛紛,路上行人欲斷魂。借問酒家何處有?牧童遙指杏花村。對於清明節,想必杜牧這首詩肯定會讓你呼之既出。今天是清明放假的最後一天,打掃完家裡的衛生,我就必須要抓緊美好的時光來記錄下 高效能程式設計師的修煉 一書第三章 高效程式設計之原則 的讀書札記。在怨天尤人之前,我們應該做好自我反省,...
網路程式設計之 協程
協程,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此 協程能保留上一次呼叫時的狀態 即所有區域性狀態的乙個特...
併發程式設計之協程
協程 是單執行緒下的併發,一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。對比作業系統控制線程的切換,使用者在單執行緒內控制協程的切換 優點 1.協程的切換開銷更小,屬於程式級別的切換,作業系統完全感知不到,因而更加輕量級 2.單執行緒內就可以實現併發的...