2009-07-29 10 views

Odpowiedz

140

Masz (co najmniej) dwa rozwiązania:

Dość „naiwne” jeden używa microtime (true) tobefore a po części kodu, aby uzyskać jak dużo czasu minęło w trakcie jego realizacji; inne odpowiedzi mówiły o tym i dawały przykłady już wcześniej, więc nie będę mógł powiedzieć dużo więcej.Alternatywę:

To jest dobre rozwiązanie, jeśli chcesz porównać kilka instrukcji, np. porównać dwa typy funkcji, na przykład - jest lepiej jeśli wykonane tysiące razy, aby upewnić się, że każdy „Element perturbating” jest uśrednione

coś takiego, więc, jeśli chcesz wiedzieć, jak długo trzeba czekać na serializacji tablicę.

$before = microtime(true); 

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

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

Not perfect , ale przydatne, a konfiguracja nie zajmuje dużo czasu.



Innym rozwiązaniem, które działa całkiem miłe, jeśli chcesz, aby określić, które funkcja zajmuje dużo czasu w całym skrypcie jest użycie:

  • Rozszerzenie Xdebug, aby wygenerować profilowanie danych dla skryptu
  • Oprogramowanie odczytujące dane profilowania i przedstawiające coś czytelnego. Znam trzy z nich:
    • Webgrind; interfejs sieciowy ; powinien działać na dowolnym serwerze Apache + PHP
    • WinCacheGrind; tylko w przypadku okien:
    • KCacheGrind; prawdopodobnie tylko Linux i linux-like; To jeden Wolę, btw

Aby uzyskać profilowania plików, trzeba zainstalować i skonfigurować Xdebug; spójrz na stronę Profiling PHP Scripts dokumentacji.

Co ja generalnie nie jest umożliwienie profilera domyślnie (generuje dość duże pliki, a spowalnia rzeczy w dół), ale korzystają z możliwości, aby wysłać parametr zwany XDEBUG_PROFILE GET dane, aby włączyć profilowanie tylko dla strona, której potrzebuję.
Część związane profilowanie-mego php.ini wygląda następująco:

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 

(Czytaj dokumentację więcej informacji)

Ten zrzut ekranu jest z programu C++ w kcachegrind: http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
Dostaniesz dokładnie to samo ze skryptami PHP ;-)
(Z KCacheGrind, mam na myśli, WinCacheGrind nie jest tak dobry jak KCacheGrind ...)

To pozwala uzyskać ładny widok, co wymaga czasu w aplikacji - i to czasem zdecydowanie pomaga zlokalizować funkcję że wszystko jest spowolnienie dół ^^

Zauważ, że Xdebug zlicza czas spędzony procesora przez PHP; kiedy PHP czeka na odpowiedź z bazy danych (na przykład), to nie działa; tylko czekanie. Tak więc Xdebug pomyśli, że żądanie DB nie zajmuje dużo czasu!
To powinno być wyprofilowane na serwerze SQL, nie PHP, więc ...


Nadzieja jest to pomocne :-)
Miłej zabawy!

+2

Dziękuję bardzo ... – risyasin

+0

Istnieje wersja Windowsa QCacheGrind :-) https://sourceforge.net/projects/qcachegrindwin –

2

Jeśli jest to coś, co można przetestować poza kontekstem sieci, po prostu używam polecenia Unix time.

+1

A co z oknami? –

29

Do szybkiego rzeczy to zrobić (w PHP):

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

Można również użyć profilera jak http://xdebug.org/.

+2

Dla dodatkowej dokładności sugerowałbym (a) użycie pętli i uśrednienie czasu oraz (b) używanie oddzielnych plików dla każdej testowanej rzeczy. Jeśli masz kilka taktów w jednym skrypcie, ich kolejność może czasami coś zmienić. – DisgruntledGoat

0

Możesz użyć podstawowych rzeczy, takich jak przechowywanie znaczników czasu lub mikrotime() przed i po operacji, aby obliczyć potrzebny czas. To łatwe, ale niezbyt dokładne. Może lepszym rozwiązaniem jest Xdebug, nigdy z nim nie pracowałem, ale wydaje mi się, że jest to najbardziej znany debugger/profiler PHP, jaki mogę znaleźć.

2

Zend Studio ma wbudowaną obsługę profilowania przy użyciu XDebug lub ZendDebugger. Będzie profilować twój kod, informując dokładnie o tym, ile czasu zajęła każda funkcja. To fantastyczne narzędzie do określania, gdzie znajdują się wąskie gardła.

3

Chciałbym podzielić się z wami self made funkcji używać do pomiaru prędkości istniejącej funkcji do 10 argumentów:

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; 

} 

Przykład

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

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

Zwraca

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

Zrobiłem prosty termin klasy, może to „S przydatne do kogoś:

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"; 
    } 

} 

Zastosowanie:

$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 
+0

You mistyped: to 'echo', a nie' $ echo' – SuN

+0

poprawione, dziękuję –

3

Jeśli chcesz szybkiego wykonania testu ram, które można umieścić w index.php pliku

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

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

Za każdym razem, gdy otrzymasz czas wykonania w milisekundach. Ponieważ mikrosekundy nie są zbyt użyteczne w testowaniu przypadku szkieletowego.

5

Tutaj jest bezpośrednią odpowiedzią na pytanie

jest tam oprogramowanie do pomiaru tego?

Tak, istnieje. Zastanawiam się, dlaczego nikt jeszcze o tym nie wspominał. Chociaż sugerowane powyżej odpowiedzi wydają się w porządku dla szybkiego sprawdzenia, ale nie są skalowalne w dłuższej perspektywie lub w przypadku większego projektu.

Dlaczego nie użyć narzędzia do monitorowania wydajności aplikacji (APM), które jest zbudowane właśnie do tego celu i wiele więcej. Sprawdź NewRelic, AppDynamics, Ruxit (wszystkie mają darmową wersję), aby monitorować czas wykonania, zużycie zasobów, przepustowość każdej aplikacji na poziomie metody.