我有以下被调用的宏很多(对于 8 页的文档,其值为 2871),因为它是由预处理器生成的:
\newcommand{\varid}[1]{\textbf{#1}}}
使用 的分析器库tikz
,我发现这个宏占了编译时间的 2/3,另外 1/6 是由于前导码。
microtype
我还可以将其归因于包和的使用newtxmath
,它们都包含在内acmart
。
以下是一些观察结果:
- 如果我包装
\textbf
,\mbox
性能就很好。 - 如果我摆脱对 或 的依赖
microtype
,newtxmath
性能就会很好。 - 当然我可以解决这个问题;我只是认为它不行需要速度如此之慢,正如 (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{$..$}
就会使速度更快。