[bmx] TProfiler Class by AntonyWells [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:39

Previous topic - Next topic

BlitzBot

Title : TProfiler Class
Author : AntonyWells
Posted : 1+ years ago

Description : Profile your functions to determine bottlenecks in your code.

Example

Import "Profiler.bmx" ' This is the code archive entry below

function Test()
   TProfiler.Enter("Test")
   for j=1 to 10000000
    local k = sin(j)*cos(j)+atan(sin(2),cos(2))
 next
  TPRofiler.Leave("Test")
end function




Create a unique enter leave name for each function.

You can also isolate and profile specific chunks of code by placing enter and leave at the top and bottom of the intended target.

On program exit the class automatically saves a profiler.txt file. it does this using an onEnd hook. [/i]

Code :
Code (blitzmax) Select
Strict
Type TLength
Field time:Int
End Type

Type TCall

Field name:String
Field start
Field Times:TList
Field calls
Method New()
times = CreateList()
End Method

End Type

tprofiler.calls = CreateList()
Type TProfiler

Global calls:TList
Function DumpLog( file:String )

Local fi:TStream = WriteFile( file )

WriteLine fi,"Aurora Profiler Log V1.0"
For Local c:TCall = EachIn calls

WriteLine fi,"----------------------------"
Local totTime=0
For Local t:TLength = EachIn c.times
totTime:+t.time
Next
WriteLine fi,"Function:"+C.name+" Calls:"+c.calls+" Total:"+TotTime+" Avg:"+Float(TotTime)/Float(c.calls)
WriteLine fi,"Total (Seconds):"+String( Float(tottime)/Float(1000) )
WriteLine fi,"Avg (Seconds):"+String( (Float(TotTime)/Float(c.calls) ) / Float(1000) )
Next


CloseFile fi

End Function

Function Enter( func:String )

For Local call:tcall = EachIn calls

If call.name = func

call.start = MilliSecs()
call.calls:+1
Return

EndIf

Next

Local call:TCall = New tcall
calls.addlast( call )
call.calls = 1
call.name = func
call.start = MilliSecs()

End Function

Function Leave( func:String )

For Local call:Tcall = EachIn calls

If call.name = func

Local l:TLength = New tlength
l.time = MilliSecs()-call.start
call.times.addlast( l )
Return

End If

Next

RuntimeError "Unknown function"

End Function

End Type
OnEnd( EndHook )
Function EndHook()

Print "Dumping profile information."
TProfiler.DumpLog("Profiler.txt")
Print "Dumped."

End Function


Comments :


Damien Sturdy(Posted 1+ years ago)

 This is really useful actually, GenevaTheGenWhatsis.


AntonyWells(Posted 1+ years ago)

 Yes it is, CyngusTheSingingDetective


AntonyWells(Posted 1+ years ago)

 Yes it is, CyngusTheSingingDetective


fredborg(Posted 1+ years ago)

 Small handy addition:
Import "Profiler.bmx" ' This is the code archive entry below

function Test()
  ?debug
   TProfiler.Enter("Test")
  ?
   for j=1 to 10000000
    local k = sin(j)*cos(j)+atan(sin(2),cos(2))
 next
  ?debug
  TPRofiler.Leave("Test")
  ?
end function



plash(Posted 1+ years ago)

 or you could go further and do.. Function Enter( func:String )
?debug
For Local call:tcall = EachIn calls

If call.name = func

call.start = MilliSecs()
call.calls:+1
Return

EndIf

Next

Local call:TCall = New tcall
calls.addlast( call )
call.calls = 1
call.name = func
call.start = MilliSecs()
?
End Function

Function Leave( func:String )
       ?debug
For Local call:Tcall = EachIn calls

If call.name = func

Local l:TLength = New tlength
l.time = MilliSecs()-call.start
call.times.addlast( l )
Return

End If

Next

RuntimeError "Unknown function"
?
End Function
though the app would still be wasting time by even calling the function.. unless max is smart enough to know that its completely useless in release mode.. [/i]