Feed Facebook

A-A+

PHP程式加速探索之代碼優化

一是消除錯誤的或低效的迴圈;二是優化資料庫查詢語句。其實還存在一些其他的優化細節,比如“str_replace比ereg_replace快”、“echo比print快”等等。這些我暫時都放在一邊,稍後我會提到用緩存來對付過於頻繁的IO。
下面我們將三個功能相同,但程式寫法不同的函數的效率(消耗的時間)進行對比。
badloops.php

<?php
require_once(’Benchmark/Iterate.php’);
define(’MAX_RUN’,100);
$data = array(1, 2, 3, 4, 5);
doBenchmark(’v1′, $data);
doBenchmark(’v2′, $data);
doBenchmark(’v3′, $data);
function doBenchmark($functionName = null, $arr = null)
{
reset($arr);
$benchmark = new Benchmark_Iterate;
$benchmark->run(MAX_RUN, $functionName, $arr);
$result = $benchmark->get();
echo ‘<br>’;
printf(”%s ran %d times where average exec time %.5f ms”,$functionName,$result[’iterations’],$result[’mean’] * 1000);
}
function v1($myArray = null) {
// 效率很差的迴圈
for ($i =0; $i < sizeof($myArray); $i++)
{
echo ‘<!–’ . $myArray[$i] . ‘ –> ‘;
}
}
function v2($myArray = null) {
// 效率略有提高
$max = sizeof($myArray);
for ($i =0; $i < $max ; $i++)
{
echo ‘<!–’ . $myArray[$i] . ‘ –> ‘;
}
}
function v3($myArray = null){
//最佳效率
echo “<!–”, implode(” –> <!–”, $myArray), ” –> “;
}
?>

程式輸出的結果大概是這樣的:
v1 ran 100 times where average exec time 0.18400 ms
v2 ran 100 times where average exec time 0.15500 ms
v3 ran 100 times where average exec time 0.09100 ms
可以看到,函數的執行時間變少,效率上升。
函數v1有個很明顯的錯誤,每一次迴圈的時間,都需要調用sizeof()函數來計算。函數v2則在迴圈外把$myArray陣列的元素個數存 到$max變數中,避免了每次迴圈都要計算陣列的元素個數,所以效率提高了。函數v3的效率最高,利用了現成的函數,避免迴圈。
這個例子只是給你一個感性的認識,明白什麼是相對高效的代碼。在實際開發中,我相信會有很多人會迷迷糊糊地寫出很多低效率的代碼。要把代碼寫得精煉而高效,恐怕需要時間去錘煉:-) 但這是另一個話題了,我們略過不談。
資料庫應用基本上每個PHP程式都會用到,在實際開發中我發現最影響整個系統效率的就是資料庫這部份。至於資料庫的優化和資料查詢語句的優化,在此限於篇幅不詳細討論。

標籤:

給我留言