diff options
Diffstat (limited to 'lib/profiler.nim')
-rw-r--r-- | lib/profiler.nim | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/profiler.nim b/lib/profiler.nim new file mode 100644 index 000000000..97c7dcfeb --- /dev/null +++ b/lib/profiler.nim @@ -0,0 +1,61 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# This file implements the Nimrod profiler. The profiler needs support by the +# code generator. + +type + TProfileData {.compilerproc, final.} = object + procname: cstring + total: float + +var + profileData {.compilerproc.}: array [0..64*1024-1, TProfileData] + +proc sortProfile(a: var array[0..64*1024-1, TProfileData], N: int) = + # we use shellsort here; fast enough and simple + var h = 1 + while true: + h = 3 * h + 1 + if h > N: break + while true: + h = h div 3 + for i in countup(h, N - 1): + var v = a[i] + var j = i + while a[j-h].total <= v.total: + a[j] = a[j-h] + j = j-h + if j < h: break + a[j] = v + if h == 1: break + +proc writeProfile() {.noconv.} = + const filename = "profile_results" + var i = 0 + var f: TFile + var j = 1 + while openFile(f, filename & $j & ".txt"): + closeFile(f) + inc(j) + if openFile(f, filename & $j & ".txt", fmWrite): + var N = 0 + # we have to compute the actual length of the array: + while profileData[N].procname != nil: inc(N) + sortProfile(profileData, N) + writeln(f, "total running time of each proc" & + " (interpret these numbers relatively)") + while profileData[i].procname != nil: + write(f, profileData[i].procname) + write(f, ": ") + writeln(f, profileData[i].total) + inc(i) + closeFile(f) + +addQuitProc(writeProfile) |