RomânăEnglish
 
exteon.ro - Manual
3.2.1. Exemplu recursiv

Următorul script conține funcțiile recursive a(), b() și c(), având ca încărcătură în fiecare câte o funcție usleep, pentru urmărirea timpilor de execuție. Scriptul este inclus și în exemplele din download.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
    web3tracer_enable();
    
    {
    a();
    }
    
    $profile_output_name=
        $profile_output_dir.
        'callgrind.'.
        str_replace('.','_',
            str_replace('/','_',$_SERVER['PHP_SELF'])).
        '_'.
        date('Y-m-d_H-i-s');
    web3tracer_disable(
        $profile_output_name,
        WEB3TRACER_OUTPUT_CALLGRIND);
        
    function a(){
        usleep(1000);
        if(++$GLOBALS['cycle1']<5){
            $GLOBALS['cycle2']=0;
            b();
            c();
        }
    }
    function b(){
        usleep(2000);
        if(++$GLOBALS['cycle2']<3){
            b();
        }
    }
    function c(){
        usleep(3000);
        a();
    }
?>

 

Execuția lui generează următorul arbore în Kcachegrind:

 

 

Putem face următoarele observații:

  • Toți timpii sunt exprimați în nanosecunde, pentru că KCachegrind nu acceptă valori numere reale, și există multe situații când un apel de funcție durează mai puțin de o microsecundă. Trebuie să prezentăm laude echipei XHProf pentru funcțiile excelente de temporizare.
  • Funcția date() folosită pentru generarea numelui trace-ului durează 5 milisecunde! Pentru cei care nu știau, date() este o funcție extrem de înceată.
  • Apelul recursiv b => b a fost decuplat în <CYCLE b> =[12x]> b, păstrând timpii petrecuți în fiecare apel (3ms) intacți
  • Ciclul a => c => a a fost decuplat (c => a mutată mai sus) în <CYCLE a> =[5x]> a =[4x]> c, păstrând timpii corecți, deci c este creditat corect cu 16ms
  • Deși secvența de apeluri c => a => c este deasemenea un ciclu, decuplarea apelurilor c (a => c) nu este necesară, întrucât arcul c => a a fost deja decuplat (vezi punctul anterior). Prin urmare, nu se generează un nod <CYCLE c>, păstrând lizibilitatea arborelui de execuție.

Împreună cu amprenta temporală foarte mică, procesarea corectă a apelurilor recursive este una din trăsăturile distinctive ale web3tracer.

 

Descărcați fișierul trace și examinați-l în KCachegrind. (Dacă browser-ul dvs deschide linkul ca text, copiați conținutul într-un fișier local). 


(c) SC EXTEON SRL 2006-2009, Toate drepturile rezervate
Powered by   Web3 CMS