由于复杂的 tex 文件的编译时间较长,我想测量此 tex 文件中的特定代码部分。我尝试使用 l3benchmark (https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3experimental/l3benchmark.pdf),但我只能对整个文档运行它,而不能对特定部分运行它。
我已经尝试运行 \benchmark_once:n { 特定代码部分 } 和 \benchmark_silent:n { 特定代码部分 }。在文档顶部,我使用 \RequirePackage{l3benchmark} 包含一次 l3benchmark 包,并使用 \usepackage{l3benchmark} 包含一次每个方法。
我是否遗漏了什么或者怎么可能只测量部分代码的编译时间?
提前致谢!
答案1
这里有一些 lua 代码用于对代码的性能进行计时。该socket
库内置于 LuaTeX 编译器中,请确保使用 --socket 选项启用。正如您所看到的,LaTeX 程序运行非常快速地。加载太多大字体、大图像和 tikz 图形会导致速度变慢。
\begin{filecontents*}[overwrite]{mytimer.lua}
-- table to hold time performance
M = M or {}
local socket = require('socket')
local time_stat = time_stat or {}
local gettime = socket.gettime
-- start time measurement
time_stat["total"] = 0
-- @param done indicates timer was stopped
function start_time_measure(field)
time_stat[field] = {start = gettime(), done = false}
end
-- stop time measurement
-- if two calls to stop will return wrong value
function stop_time_measure(field)
if not time_stat[field].done then
time_stat[field] = {total = gettime() - time_stat[field].start, done=true}
end
end
M.start = start_time_measure
M.stop = stop_time_measure
M.statistics = function(name) return time_stat[name].total end
-- M.start("document")
-- local s = 0
-- for i=1, 1 do s=s+1 end
-- M.stop("document")
-- print(M.statistics("document"))
-- print(M.statistics("document"))
return M
\end{filecontents*}
\directlua{timer = require("mytimer")}
\def\timerstart#1{\directlua{timer.start("#1")}}
\def\timerstop#1{\directlua{timer.stop("#1")}}
\def\timerprint#1{
\directlua{
timer.stop("#1")
tex.print("elapsed time (#1):", timer.statistics("#1").." s")
}}
\timerstart{document}
\documentclass{article}
\timerstart{package}
\usepackage{fontspec}
\setmainfont{Arial Unicode MS}
\timerstop{package}
\usepackage{lipsum}
\usepackage{luacode}
\usepackage{microtype}
\begin{document}
Hello
\timerprint{package}
\begin{luacode}
z=0
for i=0,150000000,1 do
i=i+1
z=i
end
tex.print(z)
\end{luacode}
\timerstart{lipsum}
\lipsum[1-12]
\timerstop{lipsum}
\timerprint{package}
\timerprint{lipsum}
\timerprint{document}
\end{document}