REM Code Profiler utility v0.32 for use with SDLIDE.bbc REM R.T.Russell, http://www.rtrussell.co.uk/ 27-Nov-2025 Darkmode% = INSTR(@cmd$, "-dark") <> 0 *ESC OFF VDU 23,22,800;500;8,16,16,128+8 - (128 AND Darkmode%) IF INKEY(-256) = &57 THEN SYS "SetWindowText", @hwnd%, "Profiler" SYS "ShowWindow", @hwnd%, 5 *FONT Courier New,11,B ELSE SYS "SDL_SetWindowTitle", @hwnd%, "Profiler", @memhdc% SYS "SDL_ShowWindow", @hwnd%, @memhdc% OSCLI "FONT """ + @lib$ + "DejaVuSansMono"",10" ENDIF OFF Resize% = FALSE ON ERROR ERROR 0, REPORT$ : QUIT ON MOVE Resize% OR= (@msg% == 5) : RETURN INSTALL @lib$ + "dlglib" REM!WC Constants WS_VSCROLL = &200000 LBS_EXTENDEDSEL = &800 DIM Profile$(65535), Click%(2) IF Darkmode% THEN COLOR 0, &FF, &FF, &FF COLOR 7, &40, &40, &40 COLOR 8, &80, &80, &80 COLOR 9, &7F, &7F, &7F COLOR 10, &60, &60, &60 COLOR 11, &FF, &FF, &FF COLOR 12, &00, &7F, &7F COLOR 13, &00, &7F, &FF COLOR 14, &C0, &C0, &00 COLOR 15, &10, &10, &10 ELSE PROC_setdialogpalette ENDIF Dlg% = FN_newdialog("", 0, 0) PROC_listbox(Dlg%, "", 101, 0, 0, 2 * @vdu%!208, 2 * @vdu%!212, \ \ WS_VSCROLL OR LBS_EXTENDEDSEL OR (Darkmode% AND &80000000)) PROCrefresh ON MOUSE Click%() = @msg%,@wparam%,@lparam% : RETURN IF FN_polldialog(Dlg%, 9, Click%()) REPEAT IF Resize% Resize% = FALSE : PROCresize : PROCrefresh UNTIL FN_polldialog(Dlg%, INKEY(5), Click%()) = TRUE QUIT DEF PROCrefresh LOCAL C%, F%, I% REM Read data file: F% = OPENIN(@tmp$ + "sdldebug.dat") IF F% THEN C% = FNreport(Profile$(), F%) CLOSE #F% IF C% THEN PROC_setlistboxarray(Dlg%, 101, Profile$(), C%) F% = OPENOUT(@tmp$ + "profiler.rpt") FOR I% = 1 TO C% PRINT #F%,Profile$(I%) : BPUT #F%,&A NEXT CLOSE #F% ENDIF ENDIF PROC_refreshdialog(Dlg%) ENDPROC DEF FNreport(p$(), F%) LOCAL @%, I%, S%, F$, N$, lin%, tim%, all%, dur%, text$, bbcfile$ PTR#F% = 9 IF (BGET#F% AND 1) = FALSE THEN = 0 bbcfile$ = GET$#F% TO 0 IF INSTR(bbcfile$, "/") = 0 IF INSTR(bbcfile$, "\") = 0 bbcfile$ = @tmp$ + bbcfile$ text$ = TIME$ p$(1) = "Profiler report for " + LEFT$(LEFT$(LEFT$(LEFT$(MID$(bbcfile$, LEN(@tmp$)+1))))) p$(3) = LEFT$(text$,4)+" "+MID$(text$,5,12)+" "+MID$(text$,17) p$(5) = "Figures in the first column indicate approximate" p$(6) = "time in milliseconds spent in each program line." p$(8) = "Figures in the second column indicate approximate" p$(9) = "percentage of the time spent in each program line." REM Get the total time: dur% = BGET#F% + (BGET#F%<<8) + (BGET#F%<<16) + (BGET#F%<<24) @% = &0102030A p$(11) = "Time spent profiling: "+STR$(dur%/1000)+" seconds." REM Prevent a Division by Zero Error IF dur% =0 THEN dur%=1 REM List the source file: VDU 21 OSCLI "SPOOL """ + @tmp$ + "profiler.bas.tmp""" OSCLI "LIST """ + bbcfile$ + """" *SPOOL VDU 6 REM Create the rest of the report S% = OPENIN(@tmp$ + "profiler.bas.tmp") FOR I% = 1 TO 7 INPUT #S%, text$ NEXT I% = BGET#S% PTR#F% = PTR#F% + 24 lin% = 0 WHILE NOT EOF#S% INPUT #S%, text$ I% = BGET#S% tim% = BGET#F% + (BGET#F%<<8) + (BGET#F%<<16) + (BGET#F%<<24) all% += tim% @% = &0102020A N$ = STR$(100*tim%/dur%) @% = &90A F$ = RIGHT$(" "+N$,8) IF VAL(F$)<0.01 THEN F$=" " p$(lin%+13) = RIGHT$(" "+STR$(tim%),10)+": "+F$+" "+text$ lin% += 1 ENDWHILE CLOSE #S% @%=&0102020A N$=STR$(100*(dur%-all%)/dur%) @% = &90A F$=RIGHT$(" "+N$,8) IF VAL(F$)<0.01 THEN F$=" " p$(lin%+14) = RIGHT$(" " + STR$(dur%-all%),10) + ": " + F$ + \ \ " Libraries and immediate mode" = lin%+14 DEF PROCresize PRIVATE S% IF S% ENDPROC S% = TRUE VDU 26 IF POS : REM SDL thread sync Dlg% = FN_newdialog("", 0, 0) PROC_listbox(Dlg%, "", 101, 0, 0, 2 * @vdu%!208, 2 * @vdu%!212, WS_VSCROLL) S% = FALSE ENDPROC