原理不限程式語言,但本篇僅以 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 級別,如廣告競價 / 即時遊戲 / 高頻交易,這些技巧將有助於我們更進一步優化。