逐页编译时间

逐页编译时间

我正在尝试找出非常大的文档编译中的瓶颈。

接受的答案这个问题以一种巧妙的方式解决了这个问题,但是该方法仅适用于 pdflatex(而不适用于 LuaTeX 和 XeTeX),因为该\pdfelapsedtime原语仅在 pdflatex 中可用。

然而这个问题\pdfelapsedtime为 LuaTex创建一个类似物。

问题是如何在 XeTeX 中执行

答案1

由于 XeTeX 没有计时功能,因此保留了 shell 转义功能。缺点是运行持续时间变化的外部程序的开销很大。

以下示例以纯文本和 LaTeX 格式运行。它是为 Linux 下的 Perl 编写的,需要开关-shell-escape

xetex -shell-escape test
xelatex -shell-escape test

接口是(宏名称以 为前缀xetk):

  • \xetkresettimer类似于\pdfresettimer定时器重置。

  • \xetksetelapsedtime获取与上次调用的当前时间差\xetkresettimer

  • \xetkelapsedtime包含以十进制数表示的秒数时间,由 设定\xetksetelapsedtime

文件test.tex

\catcode`\@=11 % \makeatletter

\newread\xetk@pipe
\def\xetk@resetargs{}

\def\xetkresettimer{%
  \begingroup
    % the end of line character must be disabled,
    % otherwise it could add active characters, ...
    \endlinechar=-1 %
    \openin\xetk@pipe="|perl -e '%
      use Time::HiRes qw[gettimeofday];%
      @t=gettimeofday;%
      print qq[@t]%
    '"\relax
    \global\read\xetk@pipe to\xetk@resetargs
    \closein\xetk@pipe
  \endgroup
}
\xetkresettimer
\wlog{XeTeX timekeeping initialization: \xetk@resetargs}
\def\xetkelapsedtime{0}

\edef\xetksetelapsedtime{%
  \begingroup
    \endlinechar=-1 %
    \openin\xetk@pipe="|perl -e '%
      use Time::HiRes qw[tv_interval];%
      print tv_interval(\string\@ARGV)%
    ' -- \noexpand\xetk@resetargs"\relax
    \global\read\xetk@pipe to\noexpand\xetkelapsedtime
    \closein\xetk@pipe
  \endgroup
}

%%% Testing

\def\test{%
  \xetkresettimer
  \xetksetelapsedtime
  \immediate\write16{* Elapsed time: \xetkelapsedtime\space s}%
}

\test
\test
\test
\test
\test

\csname @@end\endcsname\end % end job

\test重置计时器(调用外部程序),不执行任何操作并再次调用外部程序来获取时间差:

* Elapsed time: 0.032371 s
* Elapsed time: 0.032007 s
* Elapsed time: 0.035123 s
* Elapsed time: 0.032473 s
* Elapsed time: 0.033759 s

相关内容