1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import options, vmdef, lineinfos, msgs
import std/[times, strutils, tables]
proc enter*(prof: var Profiler, c: PCtx, tos: PStackFrame) {.inline.} =
if optProfileVM in c.config.globalOptions:
prof.tEnter = cpuTime()
prof.tos = tos
proc leaveImpl(prof: var Profiler, c: PCtx) {.noinline.} =
let tLeave = cpuTime()
var tos = prof.tos
var data = c.config.vmProfileData.data
while tos != nil:
if tos.prc != nil:
let li = tos.prc.info
if li notin data:
data[li] = ProfileInfo()
data[li].time += tLeave - prof.tEnter
if tos == prof.tos:
inc data[li].count
tos = tos.next
proc leave*(prof: var Profiler, c: PCtx) {.inline.} =
if optProfileVM in c.config.globalOptions:
leaveImpl(prof, c)
proc dump*(conf: ConfigRef, pd: ProfileData): string =
var data = pd.data
result = "\nprof: µs #instr location"
for i in 0..<32:
var tMax: float
var infoMax: ProfileInfo = default(ProfileInfo)
var flMax: TLineInfo = default(TLineInfo)
for fl, info in data:
if info.time > infoMax.time:
infoMax = info
flMax = fl
if infoMax.count == 0:
break
result.add " " & align($int(infoMax.time * 1e6), 10) &
align($int(infoMax.count), 10) & " " &
conf.toFileLineCol(flMax) & "\n"
data.del flMax
|