Simple Profiler

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Simple Profiler

Beitrag von Kiffi »

Moin, Moin,

ich habe eben im BCX-Forum eine interessante Idee aufgeschnappt. Es
geht um einen Profiler für PureBasic. Hierzu muss man den Source-Code
eines Programmes mit entsprechenden Kontrollstrukturen versehen und
diese nach Durchlauf des Programmes auswerten und anzeigen.

Nachfolgend habe ich mal ein ziemlich simples Beispiels zusammengestellt,
welches die Aufrufen einzelner Zeilen eines Code zählt und diese in einem
ListIconGadget anzeigt. Deshalb dient dieser Code nur zur Verdeutlichung.

Denn interessanter ist es zu prüfen, wie viel Zeit die einzelnen Zeilen (und
in Summe die einzelnen Prozeduren/Funktionen) für deren Ausführungen
benötigen.

Also, wer übernimmt nun die ehrenvolle Aufgabe, einen vernünftigen
Profiler für PB zu erstellen? ;)

Grüße ... Kiffi

Code: Alles auswählen

Structure s_Profiler
  sInputLine.s
  sProfiler.s
EndStructure

NewList SourceLines.s_Profiler()

sInputFile.s  = "C:\profilertest.pb"
sOutputFile.s = "C:\profilertest_p.pb"

Declare.s GetProfilerGUI()

;  Pass 1: Alle Zeilen des Source einlesen

FF = ReadFile(#PB_Any, sInputFile)

If FF
  Repeat
    If Eof(FF) :  Break :  EndIf
    AddElement(SourceLines())
    SourceLines()\sInputLine = ReadString()
  ForEver  
  CloseFile(FF)
EndIf

;  Pass 2: Alle Zeilen des Source analysieren und ggf. mit einem ProfileMarker versehen

ResetList(SourceLines())

While NextElement(SourceLines())
  
  sLine.s = SourceLines()\sInputLine
  
  LineFlag = 1
  
  If Left(LTrim(sLine),1) = ";"  ; skip lines that begin with ; (remark)
    LineFlag = 0
  EndIf
  
  If Trim(sLine) = ""   ; skip lines that are blank
    LineFlag = 0
  EndIf

  If LineFlag
    
    CallCount + 1
    SourceLines()\sProfiler = "ProfileMarker(" + LTrim(Str(CallCount)) + ") + 1"
    
  EndIf
  
Wend

; Pass 3: Profilerdatei schreiben

FF = CreateFile(#PB_Any,sOutputFile)
 
If FF
 
  ResetList(SourceLines())
   
  WriteStringN("Declare ShowProfilerGUI()")
  
  WriteStringN("Dim ProfileMarker(" + Str(CallCount) + ")")
  
  While NextElement(SourceLines())

    WriteStringN(SourceLines()\sInputLine)
    
    If Len(SourceLines()\sProfiler) > 0
      
      WriteStringN(SourceLines()\sProfiler)
      
    EndIf
    
  Wend

  ; GUI schreiben für spätere Auswertung

  WriteStringN( GetProfilerGUI() )
  
  CloseFile(FF)
  
EndIf

Procedure.s GetProfilerGUI()
  
  DefType.s sGUI

  Shared CallCount
  
  sGUI = "ShowProfilerGUI()" + #CRLF$ 
  sGUI + "Procedure ShowProfilerGUI()" + #CRLF$ 
  sGUI + "  If OpenWindow(0, 0, 0, 300, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , " + Chr(34) + "Profiler" + Chr(34) + ")" + #CRLF$
  sGUI + "    If CreateGadgetList(WindowID(0))" + #CRLF$
  sGUI + "      ListIconGadget(1, 10,10,280,480, " + Chr(34) + "ProfileMarker" + Chr(34) + ", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)" + #CRLF$
  sGUI + "      AddGadgetColumn(1, 1, " + Chr(34) + "Calls" + Chr(34) + ",100)" + #CRLF$
  sGUI + "      For intI = 1 To " + Str(CallCount) + #CRLF$
  sGUI + "        AddGadgetItem(1,-1," + Chr(34) + "ProfileMarker(" + Chr(34) + " + Str(intI) + " + Chr(34) + ")" + Chr(34) + " + Chr(10) + Str(ProfileMarker(intI)))" + #CRLF$
  sGUI + "      Next intI" + #CRLF$
  sGUI + "      Repeat" + #CRLF$
  sGUI + "        EventID.l = WaitWindowEvent()" + #CRLF$
  sGUI + "        If EventID = #PB_Event_CloseWindow" + #CRLF$
  sGUI + "          Quit = 1" + #CRLF$
  sGUI + "        EndIf" + #CRLF$
  sGUI + "      Until Quit = 1" + #CRLF$
  sGUI + "      CloseWindow(0)" + #CRLF$
  sGUI + "    EndIf" + #CRLF$
  sGUI + "  EndIf" + #CRLF$
  sGUI + "EndProcedure" + #CRLF$

  ProcedureReturn sGUI
  
EndProcedure
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Bisschen schade, dass das auch z.B. gnadenlos in Enumerations
reinschreibt, aber die Idee ist auf jeden Fall ausgesprochen lobenswert
und die Entschuldigung, dass das nur ein Beispiel ist, zieht auch halbwegs :wink:
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> aber die Idee ist auf jeden Fall ausgesprochen lobenswert

naja, vielleicht kann ich das Jungvolk hier mal dazu animieren, anstelle des
x-sten nicht fertiggestellten EgoShooters (Mediaplayers, Chats (gääähn)
whatever...) mal was anständiges zu programmieren. /:->

> und die Entschuldigung, dass das nur ein Beispiel ist, zieht auch halbwegs

;)

Grüße ... Kiffi
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Kiffi hat geschrieben:> aber die Idee ist auf jeden Fall ausgesprochen lobenswert

naja, vielleicht kann ich das Jungvolk hier mal dazu animieren, anstelle des
x-sten nicht fertiggestellten EgoShooters (Mediaplayers, Chats (gääähn)
whatever...) mal was anständiges zu programmieren. /:->

> und die Entschuldigung, dass das nur ein Beispiel ist, zieht auch halbwegs

;)

Grüße ... Kiffi
Wann gehört man denn zum "Jungvolk"?
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Wann gehört man denn zum "Jungvolk"?

wenn man pro Posting mehr als 5 Smilies verwendet ;)

Grüße ... Kiffi
a²+b²=mc²
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Kiffi hat geschrieben:> Wann gehört man denn zum "Jungvolk"?

wenn man pro Posting mehr als 5 Smilies verwendet ;)

Grüße ... Kiffi
Ok, alles klar, ich weiß was du meinst. :mrgreen:
Antworten