summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/trac-tim.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/trac-tim.lmt')
-rw-r--r--tex/context/base/mkiv/trac-tim.lmt177
1 files changed, 177 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/trac-tim.lmt b/tex/context/base/mkiv/trac-tim.lmt
new file mode 100644
index 000000000..ce61c7440
--- /dev/null
+++ b/tex/context/base/mkiv/trac-tim.lmt
@@ -0,0 +1,177 @@
+if not modules then modules = { } end modules ['trac-tim'] = {
+ version = 1.001,
+ comment = "companion to m-timing.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, gsub = string.format, string.gsub
+local concat, sort = table.concat, table.sort
+local next, tonumber = next, tonumber
+
+moduledata = moduledata or { }
+local progress = moduledata.progress or { }
+moduledata.progress = progress
+
+local report_timing = logs.reporter("timing")
+
+if not nodes then nodes = { } end -- when loaded in mtxrun
+
+progress.defaultfilename = ((tex and tex.jobname) or "whatever") .. "-luatex-progress"
+
+-- storage
+
+function progress.store()
+ nodes.snapshots.takesample()
+end
+
+function progress.save(name)
+ local filename = (name or progress.defaultfilename) .. ".lut"
+ report_timing("saving data in %a",filename)
+ table.save(filename,nodes.snapshots.getsamples())
+ nodes.snapshots.resetsamples()
+end
+
+-- conversion
+
+local processed = { }
+
+local function convert(name)
+ name = name ~= "" and name or progress.defaultfilename
+ if not processed[name] then
+ local pages = 0
+ local names = { }
+ local top = { }
+ local bot = { }
+ local siz = { }
+ local paths = { }
+ local data = table.load(name .. ".lut")
+ if data then
+ pages = #data
+ if pages > 1 then
+
+ local factor = 100
+
+ local function path(tag,subtag,tagname)
+ local tagname = tag .. ": " .. subtag
+ local b, t, s = nil, nil, { }
+ for k=1,#data do
+ local v = data[k][tag]
+ v = v and v[subtag]
+ if v then
+ if type(v) == "table" then
+ set[tagname] = tonumber(v.set)
+ v = tonumber(v.top)
+ else
+ v = tonumber(v)
+ end
+ if v then
+ if b then
+ if v > t then t = v end
+ if v < b then b = v end
+ else
+ t = v
+ b = v
+ end
+ else
+ v = 0
+ end
+ else
+ v = 0
+ end
+ s[k] = v
+ end
+ if not b then
+ -- safeguard against updates
+ b = 0
+ t = 0
+ end
+ top[tagname] = gsub(format("%.3f",t),"%.000$","")
+ bot[tagname] = gsub(format("%.3f",b),"%.000$","")
+ local delta = t - b
+ if delta == 0 then
+ delta = 1
+ else
+ delta = factor/delta
+ end
+ for k=1,#s do
+ s[k] = format("(%.3f,%.3f)",k,(s[k]-b)*delta)
+ end
+ paths[tagname] = concat(s,"--")
+ return tagname
+ end
+
+ local function collect(category)
+ if data[1][category] then
+ local keys = { }
+ for k=1,#data do
+ for k, v in next, data[k][category] do
+ keys[k] = true
+ end
+ end
+ for k=1,#data do
+ local m = data[k][category]
+ for k, v in next, keys do
+ if not m[k] then m[k] = 0 end
+ end
+ end
+ for k in next, keys do
+ names[#names+1] = path(category,k)
+ end
+ end
+ end
+
+ collect("nodes")
+ collect("memories")
+ collect("variables")
+ collect("texvariables")
+ collect("luavariables")
+ collect("texcallbacks")
+ collect("mpcallbacks")
+ collect("backendcallbacks")
+
+ pages = pages - 1 -- hm
+ end
+ end
+
+ sort(names)
+
+ processed[name] = {
+ names = names,
+ top = top,
+ bot = bot,
+ set = set,
+ pages = pages,
+ paths = paths,
+ }
+ end
+ return processed[name]
+end
+
+progress.convert = convert
+
+function progress.set(name,tag)
+ return convert(name).set[tag] or 0
+end
+
+function progress.bot(name,tag)
+ return convert(name).bot[tag] or 0
+end
+
+function progress.top(name,tag)
+ return convert(name).top[tag] or 0
+end
+
+function progress.pages(name,tag)
+ return convert(name).pages or 0
+end
+
+function progress.path(name,tag)
+ return convert(name).paths[tag] or "origin"
+end
+
+function progress.names(name)
+ return convert(name).names or { }
+end
+