PHP 針對 CPU Cache 設計的簡單範例
原理不限程式語言,但本篇僅以 PHP 程式語言為例。
CPU Cache 的特性
不是只有 C / C++ 需要瞭解硬體特性,任何程式語言若能瞭解硬體特性都將有助於底層事務的瞭解與優化。
這裡我以 CPU Cache 為例。目前一般 CPU 通常都有四區 Cache,L1 Data Cache / L1 Instruction Cache / L2 Cache / L3 Cache。
L1 容量最小,L2 次之,L3 最大;但速度則是 L1 最快,L2 次之,L3 最慢。所以若運算所需之資料能夠保持在更快的 Cache 裡,則速度愈快。故單次處理資料量,以盡量重複利用並保持小量為原則。
PHP 陣列範例
$a = array();
$x = 1048576;
$y = 6;
for($i = 0; $i < $x; $i++) {
for($j = 0; $j < $y; $j++) {
$a[$i][$j] = 0.0;
}
}
$sum = 0;
測試存取範例一:
$start_1 = nano\second();
for($i = 0; $i < $x; $i++) {
for($j = 0; $j < $y; $j++) {
$sum += $a[$i][$j];
}
}
$start_2 = nano\second();
測試存取範例二:
$start_1 = nano\second();
for($j = 0; $j < $y; $j++) {
for($i = 0; $i < $x; $i++) {
$sum += $a[$i][$j];
}
}
$start_2 = nano\second();
最終發現【範例一】比【範例二】來得快 (請注意看兩個範例不同之處)。以我的環境為例,【範例一】快了 344%,達三倍多。數據如下。
【範例一】938577408 us
【範例二】3230501888 us
上述時間精準度使用的是 PHP nanosecond 。程式範例是參考網路上某篇文章編寫,但因為手邊僅留下程式片段,已找無原始參考網頁,煩請知者告知,我將後續補充。
小結
雖然差異是 nanoseconds 級,在大多場景幾乎可以忽略,但這只是眾多運算的範例之一,而在大數據運算更突顯優勢,以及若場景已經到了追求 milliseconds 或 nanoseconds 級別,如廣告競價 / 即時遊戲 / 高頻交易,這些技巧將有助於我們更進一步優化。