Code archives/Algorithms/TProfiler Class
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
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. | |||||
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
| ||
This is really useful actually, GenevaTheGenWhatsis. |
| ||
Yes it is, CyngusTheSingingDetective |
| ||
Yes it is, CyngusTheSingingDetective |
| ||
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 |
| ||
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.. |
Code Archives Forum