2009-07-29 71 views

回答

140

(至少)兩種解決方案:

相當「天真」的人在使用microtime中(真)tobefore和代碼的一部分之後,拿到了多少時間在執行過程中已通過;其他答案已經說明了,並且已經給出了例子,所以我沒有多說。

這是一個不錯的解決方案,如果你想基準幾條指令;比如比較兩種類型的函數,比較好如果做了幾千次,以確保任何「perturbating元素」被平均

這樣的事情,所以,如果你想知道需要多長時間序列化的數組:

$before = microtime(true); 

for ($i=0 ; $i<100000 ; $i++) { 
    serialize($list); 
} 

$after = microtime(true); 
echo ($after-$before)/$i . " sec/serialize\n"; 

不完美,但是有用,並且它不需要太多時間來設置。



另一種解決方案是工作,如果你想確定哪些功能需要大量的時間在整個腳本相當不錯的,就是用:

  • Xdebug擴展,產生爲腳本分析數據
  • 讀取概要分析數據併爲您提供可讀性的軟件。我知道其中三種:
    • Webgrind;網絡界面;應該在任何Apache + PHP服務器上工作
    • WinCacheGrind;只在窗戶上
    • KCacheGrind;大概只有Linux和linux一樣;這是一個我喜歡,順便說一句

要獲得剖析文件,您必須安裝和配置XDebug的;請查看文檔的Profiling PHP Scripts頁面。

我通常做的不是默認啓用(它會產生相當大的文件,並會減慢速度)探查器,但使用的可能性來發送一個名爲XDEBUG_PROFILE參數作爲獲取數據,爲剛剛啓動剖析我需要的頁面。
我的php.ini的剖析相關的部分看起來像這樣:

xdebug.profiler_enable = 0    ; Profiling not activated by default 
xdebug.profiler_enable_trigger = 1  ; Profiling activated when requested by the GET parameter 
xdebug.profiler_output_dir = /tmp/ouput_directory 
xdebug.profiler_output_name = files_names 

(閱讀更多信息的文檔)

這張截圖是從C++程序KcacheGrind:http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
你會得到完全一樣的東西與PHP腳本;-)
(與KCacheGrind,我的意思是; WinCacheGrind不如KCacheGrind ...)

這可以讓你得到一個什麼樣的時間需要在應用程序中的美景 - 這有時definitly有助於找到功能是一切放慢^^

注意Xdebug的計算花費的CPU時間通過PHP;當PHP正在等待來自數據庫的答案時(例如),它不起作用;只有等待。所以Xdebug會認爲DB請求不需要太多時間!
這應該在SQL服務器,而不是PHP上成型,所以......


希望這有助於:-)
玩得開心!

+2

非常感謝你... – risyasin 2014-02-20 12:49:26

+0

QCacheGrind的windows構建存在:-) https://sourceforge.net/projects/qcachegrindwin – 2016-04-25 16:14:25

2

如果是可以在Web上下文外部測試的東西,我只需使用Unix time命令。

+1

窗戶怎麼樣? – 2009-07-29 17:58:36

29

爲了快速的東西,我這樣做(在PHP):

$startTime = microtime(true); 
doTask(); // whatever you want to time 
echo "Time: " . number_format((microtime(true) - $startTime), 4) . " Seconds\n"; 

你也可以使用一個分析器像http://xdebug.org/

+2

爲了獲得更高的準確性,我建議(a)使用循環和平均時間,並(b)爲每個測試的東西使用單獨的文件。如果你在一個劇本中有多個時機,他們的順序有時會有所作爲。 – DisgruntledGoat 2009-07-29 16:48:14

0

您可以使用諸如存儲時間戳或microtime()之類的基本內容來計算所需時間。這很容易做到,但不是很準確。也許更好的解決方案是Xdebug,我從來沒有使用它,但它似乎是我能找到的最着名的PHP調試器/分析器。

2

Zend Studio已經內置支持使用XDebug或ZendDebugger進行分析。它會分析你的代碼,告訴你每個函數花了多長時間。這是找出瓶頸位置的絕佳工具。

3

我想與大家分享一個自制功能,我用來衡量任何現有功能的速度可達10個參數:

function fdump($f_name='', $f_args=array()){ 

    $f_dump=array(); 
    $f_result=''; 

    $f_success=false; 

    $f_start=microtime(); 
    $f_start=explode(' ', $f_start); 
    $f_start=$f_start[1] + $f_start[0]; 

    if(function_exists($f_name)){ 

     if(isset($f_args[0])&&is_array($f_args[0])){ 
      if($f_result=$f_name($f_args)){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[1])){ 
      if($f_result=$f_name($f_args[0])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[2])){ 
      if($f_result=$f_name($f_args[0],$f_args[1])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[3])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[4])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[5])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[6])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[7])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[8])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[9])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[10])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){ 
       $f_success=true; 
      } 
     } 
    } 
    $f_end=microtime(); 
    $f_end=explode(' ', $f_end); 
    $f_end=$f_end[1] + $f_end[0]; 

    $f_time=round(($f_end - $f_start), 4); 
    $f_dump['f_success']=$f_success; 
    $f_dump['f_time']=$f_time; 
    $f_dump['f_result']=$f_result; 

    var_dump($f_dump);exit; 

    //return $f_result; 

} 

function do_stuff($arg1='', $arg2=''){ 
    return $arg1.' '.$arg2; 
} 

fdump('do_stuff',array('hello', 'world')); 

返回

array(3) { 
    ["f_success"]=> 
    bool(true) 
    ["f_time"]=> 
    float(0)   //too fast... 
    ["f_result"]=> 
    string(11) "hello world" 
    } 
8

我做了一個簡單的計時課程,也許它的有用的人:

class TimingHelper { 

    private $start; 

    public function __construct() { 
     $this->start = microtime(true); 
    } 

    public function start() { 
     $this->start = microtime(true); 
    } 

    public function segs() { 
     return microtime(true) - $this->start; 
    } 

    public function time() { 
     $segs = $this->segs(); 
     $days = floor($segs/86400); 
     $segs -= $days * 86400; 
     $hours = floor($segs/3600); 
     $segs -= $hours * 3600; 
     $mins = floor($segs/60); 
     $segs -= $mins * 60; 
     $microsegs = ($segs - floor($segs)) * 1000; 
     $segs = floor($segs); 

     return 
      (empty($days) ? "" : $days . "d ") . 
      (empty($hours) ? "" : $hours . "h ") . 
      (empty($mins) ? "" : $mins . "m ") . 
      $segs . "s " . 
      $microsegs . "ms"; 
    } 

} 

用途:

$th = new TimingHelper(); 
<..code being mesured..> 
echo $th->time(); 
$th->start(); // if it's the case 
<..code being mesured..> 
echo $th->time(); 

// result: 4d 17h 34m 57s 0.00095367431640625ms 
3

如果你想一個框架的快速測試中的表現,你可以把的index.php文件

//at beginning 
$milliseconds = round(microtime(true) * 1000); 

//and at the end 
echo round(microtime(true) * 1000) - $milliseconds; 

每次您將獲得執行時間毫秒。因爲微秒在測試框架案例中不是很有用。

5

這裏是一個直接回答你的問題

是有衡量一個軟件?

是的,有。我想知道爲什麼有人還沒有提到它。儘管上面提出的答案對於快速檢查來說似乎很好,但從長遠來看或者對於更大的項目來說不可擴展。

爲什麼不使用應用程序性能監視(APM)工具,它正是爲此而構建的,還有更多。查看NewRelic,AppDynamics,Ruxit(全部都有免費版本)來監控每個應用程序的執行時間,資源使用情況以及方法級別的吞吐量。