next up previous contents index
Next: Hjælpefunktioner til matematiske funktioner Up: M-filer Previous: Funktionsfiler   Contents   Index


Profiler

Når en M-fil bliver tilpas stor kan den tid MATLAB bruger på at udføre M-filens ordre blive så lang, at det bliver et problem. For at finde ud af hvor MATLAB bruger tiden, findes der et profileringsværktøj, som giver mulighed for at finde tidsmæssige flaskehalse i funktioner. Værktøjet giver informationer om, hvor stor en del af det totale tidsforbrug, der forbruges på hver enkelt linie i en M-fil.

Profileringsværktøjet startes med profile on, derefter køres funktionen. Kommandoen profile report genererer et HTML dokument. I dette er der både en kort oversigt hvor der bla. står det totale tidsforbrug, og en detaljeret profil af funktionen, hvor der specificeres hvor meget tid der bruges på hver enkelt programlinie. Profileringen afsluttes med profile off.

Eksempel

Funktionen herunder generer en tabel med funktionsværdierne for funktionen $ y=1+x^3$ i intervallet $ [-2:2]$ i step af $ 0.001$ og gemmer $ x$- og $ y$ værdierne i hhv. r og s.

    function profiex
    r=[];s=[];
    for x=-2:0.001:2
        y=1+x^3;
        r=[r x];
        s=[s y];
    end

Først fortæller man MATLAB at funktionen ønskes profileret:

    profile on
Dernæst køres funktionen:
    profiex
Og tilsidst genereres en tidprofil af funktionen:
    profile report, profile off
HTML dokumentet startes nu automatisk op og i dette tilfælde bla. viser:
    Total recorded time: 4,46s
mens den detaljeret profil viser:
    100% of the total time in this function was 
         spend on the following lines:


                        3:     for x=-2:0.001:2
    0.121s,       3 %   4:         y=1+x^3;
    2.253s,      51 %   5:         r=[r x];
    2.052s,      46 %   6:         s=[s y];
    0.030s,       1 %   7:     end 
Som det fremgår er det række 5 og 6, der er flaskehalse i profiex. På disse linier udføres en omfattende dynamisk allokering af hukommelse. Hver gang løkken gennemføres skal der allokeres plads til yderligere to elementer. En god vane er derfor at allokere pladsen på forhånd. En alternativ løsning kan så komme til at se således ud:
    function profiex
    x=-2:0.001:2;
    r=zeros(size(x));s=zeros(size(x));
    i=0;
        for x=-2:0.001:2
            i=i+1;
               y=1+x^3;
               r(i)=x;
               s(i)=y;
        end
Hvis samme procedure gentages fås nu en anderledes profil:
   Total recorded time: 0,17s
mens den detaljeret profil viser:
  100% of the total time in this function was 
       spend on the following lines:


                   3:  r=zeros(size(x));s=zeros(size(x));
  0.01s,     5%    4:  i=0;
                   5:  for x=-2:0.001:2
  0.04s,    19%    6:      i=i+1; 
  0.11s,    53%    7:         y=1+x^3;
  0.30s,    14%    8:         r(i)=x;
  0.01s,     5%    9:         s(i)=y;
  0.030s,    5%   10:  end 
Som det se er tidsforbruget til den dynamiske allokering betydeligt nedsat, da den kun udføres en gang.

Det mest optimale program udnytter, at MATLAB er vektorielt:

   function profiex
   x=-2:0.001:2;
   y=1+x.^3;
   r=x;
   s=y;
Profilen for dette program er:
   Total recorded time: 0.01s
med den detaljeret profil:
  100% of the total time in this function was 
       spend on the following lines:


                   3:  x=-2:0.001:2;;
  0.01s,   100%    4:  y=1+x.^3;
                   5:  r=x;
                  6:  s=y;

$ \Box$


next up previous contents index
Next: Hjælpefunktioner til matematiske funktioner Up: M-filer Previous: Funktionsfiler   Contents   Index
Bo Jakobsen 2000-08-15