1if not modules then modules = { } end modules ['trac-tim'] = {
2 version = 1.001,
3 comment = "companion to m-timing.tex",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9local format, gsub = string.format, string.gsub
10local concat, sort = table.concat, table.sort
11local next, tonumber = next, tonumber
12
13moduledata = moduledata or { }
14local progress = moduledata.progress or { }
15moduledata.progress = progress
16
17local report_timing = logs.reporter("timing")
18
19if not nodes then nodes = { } end
20
21progress.parameters = nodes and nodes.snapshots.getparameters
22progress.defaultfilename = ((tex and tex.jobname) or "whatever") .. "-luatex-progress"
23
24
25
26function progress.store()
27 nodes.snapshots.takesample()
28end
29
30function progress.save(name)
31 local filename = (name or progress.defaultfilename) .. ".lut"
32 report_timing("saving data in %a",filename)
33 table.save(filename,nodes.snapshots.getsamples())
34 nodes.snapshots.resetsamples()
35end
36
37
38
39local processed = { }
40local parameters = progress.parameters()
41
42local function convert(name)
43 name = name ~= "" and name or progress.defaultfilename
44 if not processed[name] then
45 local names, top, bot, pages, paths, keys = { }, { }, { }, 0, { }, { }
46 local data = table.load(name .. ".lut")
47 if data then
48 pages = #data
49 if pages > 1 then
50 local factor = 100
51 for k=1,#data do
52 for k, v in next, data[k].node_memory do
53 keys[k] = true
54 end
55 end
56 for k=1,#data do
57 local m = data[k].node_memory
58 for k, v in next, keys do
59 if not m[k] then m[k] = 0 end
60 end
61 end
62 local function path(tag,subtag)
63 local b, t, s = nil, nil, { }
64 for k=1,#data do
65 local v = data[k][tag]
66 v = v and (subtag and v[subtag]) or v
67 if v then
68 v = tonumber(v)
69 if b then
70 if v > t then t = v end
71 if v < b then b = v end
72 else
73 t = v
74 b = v
75 end
76 s[k] = v
77 else
78 s[k] = 0
79 end
80 end
81 local tagname = subtag or tag
82 top[tagname] = gsub(format("%.3f",t),"%.000$","")
83 bot[tagname] = gsub(format("%.3f",b),"%.000$","")
84 local delta = t-b
85 if delta == 0 then
86 delta = 1
87 else
88 delta = factor/delta
89 end
90 for k=1,#s do
91 s[k] = format("(%.3f,%.3f)",k,(s[k]-b)*delta)
92 end
93 paths[tagname] = concat(s,"--")
94 end
95 for i=1,#parameters do
96 path(parameters[i])
97 end
98 for tag, _ in next, keys do
99 path("node_memory",tag)
100 names[#names+1] = tag
101 end
102 pages = pages - 1
103 end
104 end
105 sort(names)
106 processed[name] = {
107 names = names,
108 top = top,
109 bot = bot,
110 pages = pages,
111 paths = paths,
112 }
113 end
114 return processed[name]
115end
116
117progress.convert = convert
118
119function progress.bot(name,tag)
120 return convert(name).bot[tag] or 0
121end
122
123function progress.top(name,tag)
124 return convert(name).top[tag] or 0
125end
126
127function progress.pages(name,tag)
128 return convert(name).pages or 0
129end
130
131function progress.path(name,tag)
132 return convert(name).paths[tag] or "origin"
133end
134
135function progress.nodes(name)
136 return convert(name).names or { }
137end
138
139 |