Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Proceduraufrufe zählen


delphi10 - Mo 12.05.08 11:15
Titel: Proceduraufrufe zählen
Hallo

Bei der Erstellung eines kleineren Programmes wollte ich zeitkritische Routinen näher untersuchen, dazu wollte ich einfach im ersten Ansatz die Procedur und Methoden-Aufrufe zählen um festzustellen, wieoft eine kritische Procedure/Function den tatsächlich durchlaufen wird. Die Idee war, in jede fragliche Procedur als ersten Befehl einen Aufruf einer Zählmethode einzubinden. Also etwa so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Procedur beliebig;
begin
  Zaehlemich(beliebig);
  .
  .
end;

Was man noch braucht ist eine einfache Textliste mit den Namen der zu untersuchenden Proceduren und Functionen.
Wird die unten stehende Procedure durchlaufen, wird einfach in der Liste der übergebene Begriff gesucht und - wenn gefunden, der dahinterstehende Wert incrementiert.

Delphi-Quelltext
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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
  
Beispiel Liste: Die Null muß nicht vorgegeben werden, macht den ersten Start aber schneller

Procedure1 0
Procedure2 0
.
.

  Procedure TForm3.Counter(Path,was : String);
  var
  CounterTab:     TStringList;
  i,x,y,zb:       Integer;
  sb,zw,za,womit: String;

  begin
    womit := was;
    CounterTab := TStringList.Create;//Hier nur für die Demo. Besser in das Ereignis "ProgramStart"
    try
      CounterTab.LoadFromFile(Path);//Hier nur für die Demo. Besser in das Ereignis "ProgramStart"
      for i := 0 to CounterTab.Count - 1 do
      begin
        sb := CounterTab.Strings[i]; //Nur um nicht so viel zu tippeln..
        If Pos(' ',sb) > 0  then  //Enthält die Marke bereits einen Eintrag
        delete(sb,Pos(' ',sb),(length(sb)-pos(' ',sb))); //wird er hier entfernt
        if (Pos(was,CounterTab.Strings[i]) > 0then  //um "was" zu finden.
        begin
          sb := CounterTab.Strings[i]; //Nur um nicht so viel zu tippeln..
          x := length(sb); //dito
          y := Pos(' ',sb);
          za := copy(sb,y,(x - y + 1));
          If za = was then za := '0'//Falls noch kein Eintrag vorhanden ist, Wert auf Null setzen
          zb := StrtoInt(za); //Eingetragener Wert als Integer
          inc(zb); //um 1 erhöhen
          zw := InttoStr(zb); // wieder zum String konvertieren
          womit := womit + ' ' + zw;  //an "was" dranhängen
          CounterTab.Strings[i] := was; //und zurück in die Liste
          CounterTab.Strings[i] := StringReplace(CounterTab.Strings[i],was,womit,[rfReplaceAll,rfIgnoreCase]);
        end;
      end;
      //Hier nur für die Demo. Besser in das Ereignis "ProgramEnde"
      CounterTab.SaveToFile(Path);
    finally
    CounterTab.Free;
    end;
  end;

Aufruf: counter(PfadzurListe,Procedurename);

Mittlerweile habe ich dadurch einige Programmierfehler gefunden, vielleicht kann der eine oder andere davon profitieren.
Und ja, an dem Konzept kann sicher noch einiges optimiert werden. So würde das automatische Ermitteln der Procedur- und Functionsnamen im Aufruf der Zählprocedure einiges an Vorarbeit ersparen.
Gruß Delphi10


AXMD - Mo 12.05.08 12:21

Hallo!

Ich verstehe den Sinn nicht so ganz. Für solche Zwecke (und einiges mehr) gibt es doch Profiling-Tools :gruebel:

AXMD


delphi10 - Mo 12.05.08 12:32

user profile iconAXMD hat folgendes geschrieben:
Hallo!

Ich verstehe den Sinn nicht so ganz. Für solche Zwecke (und einiges mehr) gibt es doch Profiling-Tools :gruebel:

AXMD


Es ist einfach, schnell, unkompliziert, eine schnelle Lösung, läßt sich rückstandsfrei entfernen, man muß kein Tool installieren in das man sich erst einarbeiten muß und am Schluß nicht wieder loswird, die Funktion ist nachvollziehbar, man weiß was passiert, ist beliebig anpassbar, Lizenzfrei und vor allen Dingen: Es ist selbstgemacht.
Gruß Delphi10