Jak zmierzyć szybkość kodu napisanego w PHP? [zamknięte]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 12 miesięcy temu .

Popraw to pytanie

Jak mogę powiedzieć, która z wielu klas (które wykonują tę samą pracę) wykonuje szybciej? czy jest jakiś program do pomiaru tego?

Author: M. A. Kishawy, 2009-07-29

10 answers

Masz (przynajmniej) dwa rozwiązania:

Dość "naiwny"jest użycie microtime(true) Do przed i po części kodu, aby dowiedzieć się, ile czasu upłynęło podczas jego wykonywania ; inne odpowiedzi już to mówiły i podawały przykłady, więc nie powiem więcej.

Jest to dobre rozwiązanie, jeśli chcesz porównać kilka instrukcji ; na przykład porównać dwa typy funkcji -- lepiej zrobić to tysiące razy, aby upewnić się, że jakiekolwiek " zakłócenia element " jest uśredniony.

Coś takiego, więc, jeśli chcesz wiedzieć, jak długo zajmuje serializacja tablicy:

$before = microtime(true);

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

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

Nie idealne, ale przydatne, i nie zajmuje dużo czasu, aby skonfigurować.



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

  • rozszerzenie Xdebug do generowania danych profilujących dla skryptu
  • oprogramowanie, które czyta dane profilowania i prezentuje coś czytelnego. Znam trzy z nich :
    • W związku z tym, że nie jest to możliwe, nie jest to możliwe.]}
    • WinCacheGrind ; tylko w windows
    • KCacheGrind ; prawdopodobnie tylko Linux i linux-like ; to ten, który preferuję, btw

Aby uzyskać profilowanie plików, musisz zainstalować i skonfigurować Xdebug ; spójrz na stronę Profilowanie skryptów PHP dokumentacja.

Zazwyczaj nie włączam profilera domyślnie (generuje on dość duże pliki i spowalnia działanie), ale korzystam z możliwości wysłania parametru o nazwie XDEBUG_PROFILE jako GET data, aby aktywować profilowanie tylko dla potrzebnej strony.
część mojego php związana z profilowaniem.ini wygląda tak:

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

(przeczytaj dokumentację, aby uzyskać więcej informacji)

Ten zrzut ekranu pochodzi z programu C++ w KcacheGrind : http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
(źródło: sourceforge.net)

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 tego, co wymaga czasu w aplikacji-i czasami zdecydowanie pomaga zlokalizować funkcja, która spowalnia wszystko ^^

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


Mam nadzieję, że jest to pomocne :-) Baw się dobrze !

 202
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-02 11:00:29

Na szybkie rzeczy robię to (w PHP):

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

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

 43
Author: Scott Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 13:30:15

Zrobiłem proste zajęcia z wyczucia czasu, może komuś się przyda:

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

}

Użycie:

$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 
 10
Author: Nelson Teixeira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 13:10:37

2020 Update

Minęło wiele lat, odkąd ostatni raz odpowiedziałem na te pytania, więc pomyślałem, że zasługuje to na aktualizację krajobrazu APM.

  • AppDynamics został kupiony przez Cisco, a DARMOWE konto forever, które oferowali, zostało usunięte z ich strony internetowej.
  • NewRelic obniżył ceny z $149/miesiąc/host do $25 / miesiąc / host, aby konkurować z nowym przybyszem na rynek APM, Datadog, który oferuje $31 / miesiąc / host.
  • Funkcje Datadog APM są nadal lekkie i pozostawia wiele do życzenia. Widzę jednak, że w ciągu przyszłego roku będą one udoskonalane i ulepszane.
  • Ruxit został kupiony przez Dynatrace. Nie ma tu żadnego szoku, ponieważ Ruxit jest budowany przez byłych pracowników Dynatrace. Pozwoliło to firmie Dynatrace przekształcić się w model SaaS na lepsze. Pożegnaj się z tym nieporęcznym klientem Javy, jeśli chcesz.
  • są teraz również opcje wolnego / otwartego źródła. Checkout Apache Skywalking który jest bardzo popularny w Chinach wśród ich najlepsze firmy technologiczne i PinPoint, który oferuje demo, które można wypróbować przed instalacją. Oba te wymagają zarządzania hostingiem, więc przygotuj się, aby uruchomić kilka maszyn wirtualnych i spędzić trochę czasu z instalacją i konfiguracją.
  • Nie próbowałem żadnego z tych rozwiązań APM opensource, więc nie jestem w stanie ich polecić, jednak osobiście zarządzałem wdrożeniem wszystkich tych rozwiązań APM dla wielu organizacji, zarówno w siedzibie, jak i w chmurze, przez setki lat. aplikacja / mikroserwisy. Więc mogę śmiało powiedzieć, że nie możesz się pomylić z żadnym sprzedawcą, jeśli pasuje do Twojego rachunku.


oryginalnie odpowiedział na Październik 2015

Oto bezpośrednia odpowiedź na twoje pytanie

Czy Jest jakiś program do pomiaru tego?

Tak, jest. Zastanawiam się, dlaczego nikt jeszcze o tym nie wspomniał. Chociaż odpowiedzi sugerowane powyżej wydaje się w porządku dla szybkiego sprawdzenia, ale nie jest skalowalny w dłuższej perspektywie lub dla większy projekt.

Dlaczego nie użyć narzędzia Application Performance Monitoring (APM), które są zbudowane właśnie do tego i wiele więcej. Sprawdź NewRelic, AppDynamics, Ruxit (wszystkie mają darmową wersję), aby monitorować czas wykonania, wykorzystanie zasobów, przepustowość każdej aplikacji do poziomu metody.

 10
Author: na-98,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-24 19:59:53

Jeśli chcesz szybko przetestować wydajność frameworka, możesz umieścić index.php Plik

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

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

Za każdym razem otrzymasz czas wykonania w milisekundach. Ponieważ mikrosekundy nie są zbyt przydatne w testowaniu przypadku frameworka.

 7
Author: tasmaniski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 08:00:49

Używam Ostatnio XHProf http://pecl.php.net/package/xhprof . został pierwotnie opracowany przez Facebook i jest wyposażony w przyzwoity interfejs internetowy.

 5
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 21:42:00

Chciałbym podzielić się z wami samodzielną funkcją, której używam do pomiaru prędkości dowolnej 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"
  }
 4
Author: RafaSashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 10:53:34

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

 3
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 13:22:56

Zend Studio ma wbudowane wsparcie dla profilowania za pomocą XDebug lub ZendDebugger. Będzie profilować kod, informując dokładnie, jak długo trwała każda funkcja. To fantastyczne narzędzie do wykrywania wąskich gardeł.

 3
Author: OverloadUT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 17:22:53

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

 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 13:30:44