PHP 迴圈的寫法對效能的影響

2021-06-01 18:34:53 字數 1426 閱讀 4746

看過乙個部落格討論計算機的體系結構對程式效能的影響,源程式是使用.net寫的,我想測試一下php是和這種情況一致,下面是程式的原始碼部分:

<?php 

$n = 1<<10;

$arr = array();

for($x = 0; $x < $n; $x++)

}function suma(array $arr, $n) }

return $sum;

}function sumb(array $arr, $n) }

return $sum;

}

測試的結果如下:

可以看出,sumb的效能幾乎是suma的一半,而兩個函式的功能完全相同,只是迴圈的方式不同,suma是先迴圈靠近內部的,sumb是迴圈最外部的。兩種不同的迴圈方式帶來完全兩種不同的程式效能,原部落格解釋說是因為cpu的快取記憶體的原因。

因為,前面構造的二維資料是連續的,因此他們在記憶體中的儲存方式也是連續的,類似這樣的順序儲存:

$arr[0][0]、$arr[0][1]、$arr[0][2]、$arr[0][3]、$arr[0][4]……

而sumb的迴圈方式恰好是按照資料在記憶體中儲存的順序來讀取的,這就可以充分的利用cpu的告訴快取了,因為cpu在讀取某個記憶體單元的資料時會順便把其相鄰單元的資料一起取出,儲存到快取記憶體中,也就是cpu的一級快取、二級快取、**快取等,當程式的下一條指令是需這些相鄰的記憶體單元的資料時,cpu首先檢視告訴快取中有沒有這些資料,如果有,就直接取出,不再進行定址讀取記憶體中的資料,從而節省了時間。而suma的迴圈方式是跳躍式的讀取記憶體單元中的資料,這樣cpu每次讀取資料時都無法命中快取記憶體,每次都要從記憶體中讀取,因此效率較低。

下面,我們在增加乙個函式sumc,源**如下:

function sumc(array $arr, $n)	}	

return $sum;

}

測試的結果如下:

從結果可以看出,sumc的效能又稍微比sumb好一點點,這又是為什麼呢?

比較sumb與sumc的**可以看出,sumc的迴圈方式是從後面往前面迴圈的,也就是從最後賦值的的單元開始取值,這種迴圈方式符合棧的先進後出的特點,最先賦值的單元被push到最下面,最後賦值的單元在最上面,sumc的取值方式每次都是從棧的最上面乙個單元pop出值,完全按照棧的操作方式,不會出現跳躍,因此速度也就更快了。

上面的三個函式都是從程式的源**上分析效能的好壞,其實針對陣列的迴圈操作,最好的方式是使用php自帶的優化過的foreach迴圈,這裡我們用sumd函式來說明:

function sumd(array $arr, $n)	}	

return $sum;

}

下面的是最終的測試結果,可以看出php優化過的foreach迴圈還是最快的:

synchronized 對效能的影響

public static void main string args throws exception runnable run2 new runnable runnable run3 new runnable runnable run4 new runnable newthread run1 s...

繫結變數對效能的影響

使用繫結變數對效能的影響,oracle 程式設計入門經典 beginning oracle programming 中的例子 sql alter system flush shared pool sql set serveroutput on declare l start number l cnt...

Log擴張對效能的影響

新建乙個資料庫,將資料檔案變為1000mb 以保證在實驗中資料檔案不會變化 日誌檔案大小設定為1mb,每次增長200k.不斷的向資料庫中插入資料,觀察分配頁和日誌增長的關係。log growths代表日誌檔案的增長,可以看出,每次日誌增長,page allocated都會停滯 正在進行的新頁分配的事...