diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/trac-inf.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/trac-inf.lua | 189 |
1 files changed, 93 insertions, 96 deletions
diff --git a/Master/texmf-dist/tex/context/base/trac-inf.lua b/Master/texmf-dist/tex/context/base/trac-inf.lua index 72f03675a1c..5719b953f38 100644 --- a/Master/texmf-dist/tex/context/base/trac-inf.lua +++ b/Master/texmf-dist/tex/context/base/trac-inf.lua @@ -6,100 +6,96 @@ if not modules then modules = { } end modules ['trac-inf'] = { license = "see context related readme files" } -local format = string.format +-- 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 statusinfo, n, registered = { }, 0, { } +local format = string.format +local clock = os.gettimeofday or os.clock -- should go in environment +local write_nl = texio.write_nl -statistics = statistics or { } +statistics = statistics or { } +local statistics = statistics statistics.enable = true statistics.threshold = 0.05 --- timing functions - -local clock = os.gettimeofday or os.clock +local statusinfo, n, registered, timers = { }, 0, { }, { } -local notimer - -function statistics.hastimer(instance) - return instance and instance.starttime +local function hastiming(instance) + return instance and timers[instance] end -function statistics.resettiming(instance) - if not instance then - notimer = { timing = 0, loadtime = 0 } - else - instance.timing, instance.loadtime = 0, 0 - end +local function resettiming(instance) + timers[instance or "notimer"] = { timing = 0, loadtime = 0 } end -function statistics.starttiming(instance) - if not instance then - notimer = { } - instance = notimer +local function starttiming(instance) + local timer = timers[instance or "notimer"] + if not timer then + timer = { } + timers[instance or "notimer"] = timer end - local it = instance.timing + local it = timer.timing if not it then it = 0 end if it == 0 then - instance.starttime = clock() - if not instance.loadtime then - instance.loadtime = 0 + timer.starttime = clock() + if not timer.loadtime then + timer.loadtime = 0 end - else ---~ logs.report("system","nested timing (%s)",tostring(instance)) end - instance.timing = it + 1 + timer.timing = it + 1 end -function statistics.stoptiming(instance, report) - if not instance then - instance = notimer - end - if instance then - local it = instance.timing - if it > 1 then - instance.timing = it - 1 - else - local starttime = instance.starttime - if starttime then - local stoptime = clock() - local loadtime = stoptime - starttime - instance.stoptime = stoptime - instance.loadtime = instance.loadtime + loadtime - if report then - statistics.report("load time %0.3f",loadtime) - end - instance.timing = 0 - return loadtime +local function stoptiming(instance, report) + 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 then + local stoptime = clock() + local loadtime = stoptime - starttime + timer.stoptime = stoptime + timer.loadtime = timer.loadtime + loadtime + if report then + statistics.report("load time %0.3f",loadtime) end + timer.timing = 0 + return loadtime end end return 0 end -function statistics.elapsedtime(instance) - if not instance then - instance = notimer - end - return format("%0.3f",(instance and instance.loadtime) or 0) +local function elapsedtime(instance) + local timer = timers[instance or "notimer"] + return format("%0.3f",timer and timer.loadtime or 0) end -function statistics.elapsedindeed(instance) - if not instance then - instance = notimer - end - local t = (instance and instance.loadtime) or 0 - return t > statistics.threshold +local function elapsedindeed(instance) + local timer = timers[instance or "notimer"] + return (timer and timer.loadtime or 0) > statistics.threshold end -function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds - if statistics.elapsedindeed(instance) then - return format("%s seconds %s", statistics.elapsedtime(instance),rest or "") +local function elapsedseconds(instance,rest) -- returns nil if 0 seconds + if elapsedindeed(instance) then + return format("%s seconds %s", elapsedtime(instance),rest or "") end end +statistics.hastiming = hastiming +statistics.resettiming = resettiming +statistics.starttiming = starttiming +statistics.stoptiming = stoptiming +statistics.elapsedtime = elapsedtime +statistics.elapsedindeed = elapsedindeed +statistics.elapsedseconds = elapsedseconds + -- general function function statistics.register(tag,fnc) @@ -113,7 +109,7 @@ end function statistics.show(reporter) if statistics.enable then - if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end + if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end -- this code will move local register = statistics.register register("luatex banner", function() @@ -124,11 +120,11 @@ function statistics.show(reporter) end) register("callbacks", function() local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0 - return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total) + return format("%s direct, %s indirect, %s total", total-indirect, indirect, total) end) + collectgarbage("collect") register("current memory usage", statistics.memused) register("runtime",statistics.runtime) --- -- for i=1,#statusinfo do local s = statusinfo[i] local r = s[2]() @@ -136,13 +132,27 @@ function statistics.show(reporter) reporter(s[1],r,n) end end - texio.write_nl("") -- final newline + write_nl("") -- final newline statistics.enable = false end end -function statistics.show_job_stat(tag,data,n) - texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data)) +local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once + +function statistics.showjobstat(tag,data,n) + if not logs then + -- sorry + elseif type(data) == "table" then + for i=1,#data do + statistics.showjobstat(tag,data[i],n) + end + else + if not template or n > nn then + template, n = format("%%-%ss - %%s",n), nn + report_statistics = logs.reporter("mkiv lua stats") + end + report_statistics(format(template,tag,data)) + end end function statistics.memused() -- no math.round yet -) @@ -150,48 +160,35 @@ function statistics.memused() -- no math.round yet -) return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000)) end -if statistics.runtime then - -- already loaded and set -elseif luatex and luatex.starttime then - statistics.starttime = luatex.starttime - statistics.loadtime = 0 - statistics.timing = 0 -else - statistics.starttiming(statistics) -end +starttiming(statistics) -function statistics.runtime() - statistics.stoptiming(statistics) - return statistics.formatruntime(statistics.elapsedtime(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.formatruntime(runtime) - return format("%s seconds", statistics.elapsedtime(statistics)) +function statistics.runtime() + stoptiming(statistics) + return statistics.formatruntime(elapsedtime(statistics)) end function statistics.timed(action,report) - local timer = { } - report = report or logs.simple - statistics.starttiming(timer) + report = report or logs.reporter("system") + starttiming("run") action() - statistics.stoptiming(timer) - report("total runtime: %s",statistics.elapsedtime(timer)) + stoptiming("run") + report("total runtime: %s",elapsedtime("run")) end -- where, not really the best spot for this: commands = commands or { } -local timer - -function commands.resettimer() - statistics.resettiming(timer) - statistics.starttiming(timer) +function commands.resettimer(name) + resettiming(name or "whatever") + starttiming(name or "whatever") end -function commands.elapsedtime() - statistics.stoptiming(timer) - tex.sprint(statistics.elapsedtime(timer)) +function commands.elapsedtime(name) + stoptiming(name or "whatever") + tex.sprint(elapsedtime(name or "whatever")) end - -commands.resettimer() |