pdflatex - 如何找到我的文档编译时间长的瓶颈

pdflatex - 如何找到我的文档编译时间长的瓶颈

我正在处理一个非常大的 LateX 文档(再次/仍然)。

  • >340页
  • 许多图形(大部分包括 pdf,但也有一些 PNG 或其他)
  • 许多桌子(还有长桌)
  • 生成的 PDF 大小 >18 MB
  • 许多参考文献和引文

编译通常需要 2 到 7 分钟。我使用的latexmk是完整编译,因此给出的时间通常相当于总共运行几次 latex。

尽管如此,我还是想加快重新编译的过程并尝试找到瓶颈。当我看到控制台输出时,它似乎在某些编译时间较长的地方挂起了。

有没有办法分析哪些步骤需要多少时间,从而找出可能导致 80% 编译时间的那 20% 的事情?

例如,我可以打印处理每页所需的时间并查看哪些页面需要花费最多的时间来构建吗?


帕累托规则:

感谢@Robert的回答,我现在知道了每个页面的编译时间,并且

  • 事实上,在 340 页中大约有 20 页占用了超过 50% 的编译时间!
  • 2页甚至需要大约20秒的编译时间!
  • 这些“慢速页面”似乎都不包含 PNG 图像

非常奇怪,我必须深入挖掘 - 也许交叉引用或修复注释是问题所在?!

答案1

你可以用以下方法构建你的计时器\pdfelapsedtime

\usepackage{atbegshi}
\newcommand\showtimer{%
  \message{^^Jtimer: \the\numexpr\the\pdfelapsedtime*1000/65536\relax}%
  \pdfresettimer}
\AtBeginDocument{\showtimer}
\AtBeginShipout {\showtimer}

将打印输出每页所花费的时间(以毫秒为单位)(此处第 231 页花费 103 毫秒,第 232 页花费 44 毫秒):

timer: 103 [231] 
timer: 44 [232] 

请注意,由于 tex 输出例程的异步特性,这并不完全准确:首先,分页器通常仅在段落分隔后启动,因此实际上会出现在下一页(甚至很长的段落的页面)上的材料已经处理过了;其次,插入内容(浮动、脚注)可能之前已经处理过了——例如,拆分脚注或不适合前一页的浮动。因此,这些数字实际上可以衡量前一页和后一页材料的处理时间。


为了进行评估,您可以提取以下几行:

grep '^timer:' filename.log > Compiletime.txt

答案2

您是否尝试过该\typeout{msg}命令?

http://www.personal.ceu.hu/tex/termio.htm

这可能不是最好的解决方案,但通过一些巧妙放置的\typeout命令,您可能会找到您想要的东西。

如果我没记错的话,有一个注释包可以注释掉 (La)Tex 代码的大部分内容。

答案3

如果有人感兴趣的话,这里有一个可以在 LuaLatex 中使用的版本。不确定是否有更好的 Lua 方法,但这里有一个:

\usepackage{atbegshi}

\directlua{pdfelapsedtimer_basetime=0}
\protected\def\pdfresettimer{\directlua{pdfelapsedtimer_basetime = os.clock()}}
\protected\def\pdfelapsedtime{\numexpr\directlua{tex.print(math.floor((os.clock()-pdfelapsedtimer_basetime)*65536+0.5))}\relax}
\newcommand\showtimer{%
  \message{^^Jtimer: \the\numexpr\the\pdfelapsedtime*1000/65536\relax}%
  \pdfresettimer}
\AtBeginDocument{\showtimer}
\AtBeginShipout {\showtimer}

或者更简单,只需要序言中的这三行

\directlua{pdfelapsedtimer_basetime=os.clock()}
\protected\def\pdfelapsedtime{\numexpr\directlua{tex.print(math.floor((os.clock()-pdfelapsedtimer_basetime)))}\relax}
\newcommand{\logtimer}[1]{ \message{^^JMYTIMER: #1 --  \the\numexpr\the\pdfelapsedtime\relax ^^J}}

然后在适当的位置输入如下代码

\logtimer{Before the big picture}

\logtimer{Before chapter 7}

\logtimer{After the sqiggly graph}

然后在日志中查找 MYTIMER

相关内容