59 lines
1.9 KiB
Julia
59 lines
1.9 KiB
Julia
using Memento
|
|
|
|
function setup_logging(filename::String, handlername::Symbol)
|
|
isdir(dirname(filename)) || mkdir(dirname(filename))
|
|
logger = Memento.config!("info", fmt="{date}| {msg}")
|
|
handler = DefaultHandler(filename, DefaultFormatter("{date}| {msg}"))
|
|
logger.handlers[String(handlername)] = handler
|
|
return logger
|
|
end
|
|
|
|
macro logtime(logger, ex)
|
|
quote
|
|
local stats = Base.gc_num()
|
|
local elapsedtime = Base.time_ns()
|
|
local val = $(esc(ex))
|
|
elapsedtime = Base.time_ns() - elapsedtime
|
|
local diff = Base.GC_Diff(Base.gc_num(), stats)
|
|
local ts = time_string(elapsedtime,
|
|
diff.allocd,
|
|
diff.total_time,
|
|
Base.gc_alloc_count(diff)
|
|
)
|
|
$(esc(info))($(esc(logger)), ts)
|
|
val
|
|
end
|
|
end
|
|
|
|
function time_string(elapsedtime, bytes, gctime, allocs)
|
|
str = @sprintf("%10.6f seconds", elapsedtime/1e9)
|
|
if bytes != 0 || allocs != 0
|
|
bytes, mb = Base.prettyprint_getunits(bytes, length(Base._mem_units), Int64(1024))
|
|
allocs, ma = Base.prettyprint_getunits(allocs, length(Base._cnt_units), Int64(1000))
|
|
if ma == 1
|
|
str*= @sprintf(" (%d%s allocation%s: ", allocs, Base._cnt_units[ma], allocs==1 ? "" : "s")
|
|
else
|
|
str*= @sprintf(" (%.2f%s allocations: ", allocs, Base._cnt_units[ma])
|
|
end
|
|
if mb == 1
|
|
str*= @sprintf("%d %s%s", bytes, Base._mem_units[mb], bytes==1 ? "" : "s")
|
|
else
|
|
str*= @sprintf("%.3f %s", bytes, Base._mem_units[mb])
|
|
end
|
|
if gctime > 0
|
|
str*= @sprintf(", %.2f%% gc time", 100*gctime/elapsedtime)
|
|
end
|
|
str*=")"
|
|
elseif gctime > 0
|
|
str*= @sprintf(", %.2f%% gc time", 100*gctime/elapsedtime)
|
|
end
|
|
return str
|
|
end
|
|
|
|
import Base: info, @time
|
|
|
|
Base.info(x) = info(getlogger(), x)
|
|
macro time(x)
|
|
return :(@logtime(getlogger(Main), $(esc(x))))
|
|
end
|