Feeds:
文章
留言

Archive for 十二月 22nd, 2005

 
今天對平常慣用的字串寫法的效能作一些簡單的測試,看哪一個效能比較優,以作為未來撰寫程式上的考量之一,測試程式請參考附錄,如果有錯請指教,下面是執行的結果:
$a = "hello";
$b = "world";
$c = "arick";
執行運算 100 次為一個單位時間,累計 10 個單位後取平均
case 1:
 $out = $a . $b . $c;
 平均:0.000521636009216 sec
—————————————————–
case 2:
 $out .= $a;
 $out .= $b;
 $out .= $c;
 平均:0.00125730037689 sec
—————————————————– 
case 3:
 $out = "{$a}{$b}{$c}";
 平均:0.00104262828827 sec 
—————————————————– 
case 4:
 $out = sprintf("%s%s%s", $a, $b, $c);
 平均:0.00283813476562 sec
就相對效能而言,似乎直接串接成一行的效果較佳,其次是將變數直接放入字串中,我原先以為 case 1 和 case 3 的效能應該差不多,想不到出乎我的意料,另外,我原先以為 case 3 的效能最佳,看來以後要注意一下寫法了。不過從容易修改的角度呢?我還是覺得 case 3 最優,不過可讀性稍差一些。case 4 最差是可以理解的,因為多了一層函式呼叫和其他的運算。

附錄:測試程式
<?php
class CTimer {
 var $_time_start;
 var $_time_end;
 var $_isRun;
// public:
 function CTimer(){
  $this->_time_start = -1;
  $this->_time_end = -1;
  $this->_isRun  = false;
 }
 function start(){
  if ($this->_isRun === true){
   return false;  
  }
  $this->time_start = $this->_microtime_float();
  $this->_isRun  = true;
 }
 function stop(){
  if ($this->_isRun === false){
   return false;  
  }
  $this->time_end = $this->_microtime_float();
  $this->_isRun  = false;
 }
 function getCountTime(){
  return $this->time_end – $this->time_start;
 }
// private:
 function _microtime_float()
 {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
 }
}
$aTimer = new CTimer();
$count_test = 10;
$a = "hello";
$b = "world";
$c = "arick";
$data = array();
for($k=0; $k<$count_test; ++$k){
 $aTimer->start();
 for($i = 0; $i<100; ++$i){
 // case 1:
 // $out = $a . $b . $c;
 // case 2:
 /*
  $out .= $a;
  $out .= $b;
  $out .= $c;
 */
 // case 3:
 // $out = "{$a}{$b}{$c}";
 // case 4:
  $out = sprintf("%s%s%s", $a, $b, $c);
 }
 $aTimer->stop();
 $time  = $aTimer->getCountTime();
 $data[] = $time;
}
echo array_sum($data)/$count_test ."sec<br/>";
//print_r($data);
?>

Read Full Post »