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