使用“microtype”和“newtxmath”时加速涉及“\text”的宏

使用“microtype”和“newtxmath”时加速涉及“\text”的宏

我有以下被调用的宏很多(对于 8 页的文档,其值为 2871),因为它是由预处理器生成的:

\newcommand{\varid}[1]{\textbf{#1}}}

使用 的分析器库tikz,我发现这个宏占了编译时间的 2/3,另外 1/6 是由于前导码。

microtype我还可以将其归因于包和的使用newtxmath,它们都包含在内acmart

以下是一些观察结果:

  1. 如果我包装\textbf\mbox性能就很好。
  2. 如果我摆脱对 或 的依赖microtypenewtxmath性能就会很好。
  3. 当然我可以解决这个问题;我只是认为它不行需要速度如此之慢,正如 (1) 和 (2) 所示。我花了很多时间才弄清楚到底出了什么问题。

我怎样才能加快速度\textbf(我实际上正在使用\textsf{\textsl{#1}},但这对性能没有影响)?

梅威瑟:

\documentclass{article}

\usepackage{microtype}
\usepackage{newtxmath}

\usepackage{tikz}
\usetikzlibrary{profiler}

\newcommand{\varid}[1]{\textbf{#1}}
\pgfprofilenewforcommand{\varid}{1}

\begin{document}
\[\begin{array}{c}
\varid {$x$}\\
\varid {$x$}\\
\varid {$x$}\\
\varid {$x$}\\
\varid {$x$}\\
... repeat ad lib, I had about 700 lines ...
\end{array}\]
\end{document}

对我来说,这花费了 2/3 的时间\varid

...
Overfull \vbox (16549.99998pt too high) has occurred while \output is active [2]
pgflibraryprofiler: relative values are measured against the totaltime of `main job'.
 pgflibraryprofiler(main job) {total time=0.99443sec; (99.99847%) self time=0.084sec; (8.44574%) invocations=1; }
 pgflibraryprofiler(preamble) {total time=0.24377sec; (24.51324%) self time=0.24377sec; (24.51324%) invocations=1; }
 pgflibraryprofiler(<CS>varid) {total time=0.66666sec; (67.03796%) self time=0.66666sec; (67.03796%) invocations=696; }
(./mwe.aux)
...

此外,根据\pgfprofilenewforcommand并通过管道传输结果日志tr '%.s',似乎某些调用比其他调用花费的时间更长;每次调用最多 150 毫秒。

我该怎么办?这是已知的互动吗?

答案1

\varid {$ {\tau }$}\tau将产生与but相同的输出很多更慢。 \text在显示、文本、脚本和脚本脚本样式中设置其参数 4 次,并且对于其中的每一个,它都必须设置所有的数学字体,因此即使没有微类型,它也会慢很多倍。

\tracingall长度与实际运行时间比较有很好的近似值

如果你这样做

\documentclass{article}
\usepackage{amsmath}
\begin{document}

\tracingall

$
\message{===}\tau\message{===}\text{$\tau$}\message{===}
$

\tracingnone

\end{document}

那么前两者之间===只有一行

{\mathchar"11C}

后两者之间有 3000 多行

~.\text ->\protect \text  
{\relax}

~..\text  ->\ifmmode \expandafter \text@ \else \expandafter \mbox \fi 
{\ifmmode: (level 1) entered on line 8}
{true}
{\expandafter}
{\else: \ifmmode (level 1) entered on line 8}
{\fi: \ifmmode (level 1) entered on line 8}

~..\text@ #1->{\mathchoice {\textdef@ \displaystyle \f@size {#1}}{\textdef@ \te
xtstyle \f@size {\firstchoice@false #1}}{\textdef@ \textstyle \sf@size {\firstc
hoice@false #1}}{\textdef@ \textstyle \ssf@size {\firstchoice@false #1}}\check@
mathfonts }
#1<-$\tau $
{begin-group character {}
{entering math group (level 2) at line 8}
{\mathchoice}
{entering math choice group (level 3) at line 8}

~..\textdef@ #1#2#3->\hbox {{\everymath {#1}\let \f@size #2\selectfont #3}}
#1<-\displaystyle 
#2<-\f@size 
#3<-$\tau $

.....

~..\mv@bold@reset ->

由于两个表达式的最终结果相同,因此只需删除所有
\text{$..$}或的实例\textbf{$..$}就会使速度更快。

相关内容