diff options
Diffstat (limited to 'tex/context/base/mkiv/trac-inf.lmt')
-rw-r--r-- | tex/context/base/mkiv/trac-inf.lmt | 425 |
1 files changed, 0 insertions, 425 deletions
diff --git a/tex/context/base/mkiv/trac-inf.lmt b/tex/context/base/mkiv/trac-inf.lmt deleted file mode 100644 index 9207d5b45..000000000 --- a/tex/context/base/mkiv/trac-inf.lmt +++ /dev/null @@ -1,425 +0,0 @@ -if not modules then modules = { } end modules ['trac-inf'] = { - version = 1.001, - comment = "companion to trac-inf.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- As we want to protect the global tables, we no longer store the timing --- in the tables themselves but in a hidden timers table so that we don't --- get warnings about assignments. This is more efficient than using rawset --- and rawget. - -local type, tonumber, select = type, tonumber, select -local format, lower, find, gsub, rep = string.format, string.lower, string.find, string.gsub, string.rep -local concat = table.concat -local clock = os.gettimeofday or os.clock -- should go in environment - -local setmetatableindex = table.setmetatableindex -local serialize = table.serialize -local formatters = string.formatters - -statistics = statistics or { } -local statistics = statistics - -statistics.enable = true -statistics.threshold = 0.01 - -local statusinfo, n, registered, timers = { }, 0, { }, { } - -setmetatableindex(timers,function(t,k) - local v = { timing = 0, loadtime = 0, offset = 0 } - t[k] = v - return v -end) - -local function hastiming(instance) - return instance and timers[instance] -end - -local function resettiming(instance) - timers[instance or "notimer"] = { timing = 0, loadtime = 0, offset = 0 } -end - -local ticks = clock -local seconds = function(n) return n or 0 end - -ticks = lua.getpreciseticks -seconds = lua.getpreciseseconds - -local function starttiming(instance,reset) - local timer = timers[instance or "notimer"] - local it = timer.timing - if reset then - it = 0 - timer.loadtime = 0 - end - if it == 0 then - timer.starttime = ticks() - if not timer.loadtime then - timer.loadtime = 0 - end - end - timer.timing = it + 1 -end - -local function stoptiming(instance) - local timer = timers[instance or "notimer"] - local it = timer.timing - if it > 1 then - timer.timing = it - 1 - else - local starttime = timer.starttime - if starttime and starttime > 0 then - local stoptime = ticks() - local loadtime = stoptime - starttime - timer.stoptime = stoptime - timer.loadtime = timer.loadtime + loadtime - timer.timing = 0 - timer.starttime = 0 - return loadtime - end - end - return 0 -end - -local function benchmarktimer(instance) - local timer = timers[instance or "notimer"] - local it = timer.timing - if it > 1 then - timer.timing = it - 1 - else - local starttime = timer.starttime - if starttime and starttime > 0 then - timer.offset = ticks() - starttime - else - timer.offset = 0 - end - end -end - -local function elapsed(instance) - if type(instance) == "number" then - return instance - else - local timer = timers[instance or "notimer"] - return timer and seconds(timer.loadtime - 2*(timer.offset or 0)) or 0 - end -end - -local function currenttime(instance) - if type(instance) == "number" then - return instance - else - local timer = timers[instance or "notimer"] - local it = timer.timing - if it > 1 then - -- whatever - else - local starttime = timer.starttime - if starttime and starttime > 0 then - return seconds(timer.loadtime + ticks() - starttime - 2*(timer.offset or 0)) - end - end - return 0 - end -end - -local function elapsedtime(instance) - return format("%0.3f",elapsed(instance)) -end - -local function elapsedindeed(instance) - return elapsed(instance) > statistics.threshold -end - -local function elapsedseconds(instance,rest) -- returns nil if 0 seconds - if elapsedindeed(instance) then - return format("%0.3f seconds %s", elapsed(instance),rest or "") - end -end - -statistics.hastiming = hastiming -statistics.resettiming = resettiming -statistics.starttiming = starttiming -statistics.stoptiming = stoptiming -statistics.currenttime = currenttime -statistics.elapsed = elapsed -statistics.elapsedtime = elapsedtime -statistics.elapsedindeed = elapsedindeed -statistics.elapsedseconds = elapsedseconds -statistics.benchmarktimer = benchmarktimer - --- general function .. we might split this module - -function statistics.register(tag,fnc) - if statistics.enable and type(fnc) == "function" then - -- second load can overload: - local rt = registered[tag] or (#statusinfo + 1) - statusinfo[rt] = { tag, fnc } - registered[tag] = rt - if #tag > n then n = #tag end - end -end - -local report = logs.reporter("mkiv lua stats") - -function statistics.show() - if statistics.enable then - -- this code will move - local register = statistics.register - register("used platform", function() - return format("%s, type: %s, binary subtree: %s", - os.platform or "unknown",os.type or "unknown", environment.texos or "unknown") - end) - register("used engine", function() - return format("%s version: %s, functionality level: %s, format id: %s, compiler: %s", - LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, LUATEXFORMATID, status.used_compiler) - end) - register("tex properties", function() - local t = status.gethashstate() - local m = status.gettexstate() - return format("%s hash slots used of %s, approximate memory usage: %i MB", - t.top, t.max, m.approximate // (1024 * 1024)) - end) - register("callbacks", statistics.callbacks) - -- so far - register("lua properties",function() - local hash = lua.gethashchars() - local mask = load([[τεχ = 1]]) and "utf" or "ascii" - return format("engine: %s %s, used memory: %s, hash chars: min(%i,40), symbol mask: %s (%s)", - "lua", LUAVERSION, statistics.memused(), hash, mask, mask == "utf" and "τεχ" or "tex") - end) - register("runtime",statistics.runtime) - logs.newline() -- initial newline - for i=1,#statusinfo do - local s = statusinfo[i] - local r = s[2]() - if r then - report("%s: %s",s[1],r) - end - end - -- logs.newline() -- final newline - statistics.enable = false - end -end - -function statistics.memused() -- no math.round yet -) - local round = math.round or math.floor - local luastate = status.getluastate() - return format("%s MB, ctx: %s MB, max: %s MB", - round(collectgarbage("count")//1024), - round(luastate.state_bytes//1048576), - luastate.state_bytes_max and round(luastate.state_bytes_max//1048576) or "unknown" - ) -end - -starttiming(statistics) - -function statistics.formatruntime(runtime) -- indirect so it can be overloaded and - return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua -end - -function statistics.runtime() - stoptiming(statistics) - -- stoptiming(statistics) -- somehow we can start the timer twice, but where - local runtime = lua.getruntime and lua.getruntime() or elapsedtime(statistics) - return statistics.formatruntime(runtime) -end - -local report = logs.reporter("system") - -function statistics.timed(action,all) - starttiming("run") - action() - stoptiming("run") - local runtime = tonumber(elapsedtime("run")) - if all then - local alltime = tonumber(lua.getruntime and lua.getruntime() or elapsedtime(statistics)) - if alltime and alltime > 0 then - report("total runtime: %0.3f seconds of %0.3f seconds",runtime,alltime) - return - end - end - report("total runtime: %0.3f seconds",runtime) -end - --- goodie - -function statistics.tracefunction(base,tag,...) - for i=1,select("#",...) do - local name = select(i,...) - local stat = { } - local func = base[name] - setmetatableindex(stat,function(t,k) t[k] = 0 return 0 end) - base[name] = function(n,k,v) stat[k] = stat[k] + 1 return func(n,k,v) end - statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end) - end -end - --- now here - -status.iocodes = setmetatableindex(tex.getiovalues(), function() return "unknown" end) - -local report = logs.reporter("system") - -function statistics.showusage(when) - local s = status.list() - local c = status.getcallbackstate() -- status.callbacks - local m = mplib.getcallbackstate() - local b = backends.getcallbackstate() - -- - local estatus = s.expandstate - local tstatus = s.texstate - local lstatus = s.luastate - local rstatus = s.readstate - -- - local pstatus = logs.private.getpagetiming() - -- - local iocode = status.iocodes[rstatus.iocode] - -- - local mpinstances, mpmemory = metapost.getstatistics(true) - -- - report("") - if when == "finish" then - report("status after finishing run") - else - report("status after shipping out page %s",tex.getcount("realpageno")) - end - report("") - local list = { - "stringstate", "poolstate", "hashstate", "lookupstate", - "nodestate", "extrastate", "tokenstate", - "bufferstate", "inputstate", "filestate", - "neststate", "parameterstate", "savestate", - "fontstate", "languagestate", "markstate", "sparsestate", - } - local fields = { "max", "min", "set", "stp", false, "mem", "all", false, "ini", "ptr", "top" } - local line = rep("-",190) - do - local t = { } - for i=1,#list do - t[i] = gsub(list[i],"state","") - end - report("%w%s",2,line) - report("%w%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s",5,unpack(t)) - report("%w%s",2,line) - end - for i=1,#fields do - local f = fields[i] - if f then - local t = { } - for i=1,#list do - local n = s[list[i]][f] - t[i] = n < 0 and formatters["%w"](11) or formatters["%11i"](n) - end - report(" %3s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s",f,unpack(t)) - else - report("") - end - end - report("%w%s",2,line) - report("") - report(" current input type : %s", iocode) - if iocode == "file" then - report(" current file name : %s", rstatus.filename or "") - report(" current line number : %s", rstatus.linenumber) - end - report("") - report(" approximate memory : %s (%s MB)", tstatus.approximate, tstatus.approximate // 1048576) - report("") - report(" expansion depth : min: %s, max: %s, set: %s, top: %s", estatus.min, estatus.max, estatus.set, estatus.top) - report("") - report(" luabytecode registers : %s", lstatus.bytecodes) - report(" luabytecode bytes : %s (%s MB)", lstatus.bytecode_bytes, lstatus.bytecode_bytes // 1048576) - report(" luastate bytes now : %s (%s MB)", lstatus.state_bytes, lstatus.state_bytes // 1048576) - report(" luastate bytes max : %s (%s MB)", lstatus.state_bytes_max, lstatus.state_bytes_max // 1048576) - report("") - report(" file callbacks : %s", c.file) - report(" saved callbacks : %s", c.saved) - report(" direct callbacks : %s", c.direct) - report(" function callbacks : %s", c["function"]) - report(" value callbacks : %s", c.value) - report(" message callbacks : %s", c.message) - report(" bytecode callbacks : %s", c.bytecode) - report("") - report(" mp instances : %s", mpinstances) - report(" mp estimated memory : %s (%s MB)", mpmemory, mpmemory // 1048576) - report(" mp file callbacks : %s", m.file) - report(" mp text callbacks : %s", m.text) - report(" mp script callbacks : %s", m.script) - report(" mp log callbacks : %s", m.log) - report("") - report(" total callbacks : %s", c.count) - report(" mp total callbacks : %s", m.count) - report(" backend callbacks : %s", b.count) - report("") - report(" page numbers : realpage %s, userpage %s, subpage %s",pstatus.page.real,pstatus.page.user,pstatus.page.sub) - report(" page timing : total %0.03f, page %0.03f, average %0.03f",pstatus.time.elapsed,pstatus.time.page,pstatus.time.average) - report("") -end - -function statistics.showmemory(when) - local s = status.list() - -- - report("") - report("memory configuration") - report("") - local list = { - "stringstate", "poolstate", "hashstate", "lookupstate", - "nodestate", "tokenstate", - "bufferstate", "inputstate", "filestate", - "neststate", "parameterstate", "savestate", - "fontstate", "languagestate", "markstate", - } - local fields = { "max", "min", "set", "stp" } - local line = rep("-",168) - do - local t = { } - for i=1,#list do - t[i] = gsub(list[i],"state","") - end - report("%w%s",2,line) - report("%w%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s",5,unpack(t)) - report("%w%s",2,line) - end - for i=1,#fields do - local f = fields[i] - if f then - local t = { } - for i=1,#list do - local n = s[list[i]][f] - t[i] = n < 0 and formatters["%w"](11) or formatters["%11i"](n) - end - report(" %3s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s",f,unpack(t)) - else - report("") - end - end - report("%w%s",2,line) - report("") -end - -local registered = false -local enabled = false - -trackers.register("system.usage", function(v) - if v and not registered then - logs.private.enablepagetiming() - if v ~= "summary" then - luatex.registerpageactions(function() - if enabled then - statistics.showusage("page") - end - end) - end - luatex.registerstopactions(function() - if enabled then - statistics.showusage("finish") - end - end) - registered = true - end - enabled = v -end) |