程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP開發程序加速運行探索之慢代碼優化方法

PHP開發程序加速運行探索之慢代碼優化方法

編輯:關於PHP編程

把握了PEAR::BenchMark,現在你已經知道如何測試你的代碼,知道如何判定你的代碼是快是慢,是哪一部份比較慢。那麼接下來我要說的就是如何消滅或優化那部份慢的代碼。

  這一點上我個人最主要的經驗只有兩點,一是消除錯誤的或低效的循環;二是優化數據庫查詢語句。其實還存在一些其它的優化細節,比如“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程序都會用到,在實際開發中我發現最影響整個系統效率的就是數據庫這部份。至於數據庫的優化和數據查詢語句的優化,在此限於篇幅不具體討論。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved