Introduction
Hello, I am facing very long compile times of more than 14 minutes for a ~130 page document, including around 40 PGF-Plots/TikZ-Images. Due to LaTeX's memory limits and (in fact) for speed up reasons, I decided to use the external
-package.
Then I noticed, that each image takes up to 25 seconds to render (looking into my pdflatex.log
from Miktex 2.9.
Edit: When compiling the same TikZ-images using TikzEdt, it takes only a split second from beginning to the end of compilation and the PDF being there.
Today, I created a MWE for demonstrating this effect, which seems to increase with the number of other packages loaded:
MWE (find it also here: Github)
\documentclass[]{article}
\usepackage{pgfplots}
\usepackage{graphicx}
% Comment out the next three lines for faster compilation time
\usepgfplotslibrary{external}
\tikzexternalize
\tikzsetexternalprefix{figtemp/}
\begin{document}
\section{First}
\begin{tikzpicture}
\tikz \draw[thick,rounded corners=8pt]
(0,0) -- (0,2) -- (1,3.25) -- (2,2) -- (2,0) -- (0,2) -- (2,2) -- (0,0) -- (2,0);
\end{tikzpicture}
\section{Second}
\begin{tikzpicture}
\draw (-1.5,0) -- (1.5,0);
\draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}
\section{Third}
\begin{tikzpicture}
\draw (0,0) arc (0:315:1.75cm and 1cm);
\end{tikzpicture}
\end{document}
This example gives me the two respective pdflatex.log
-Files, depending on whether externalization is enabled or disabled:
Externalization enabled
Total time: ~14.0 s
2019-03-05 13:21:31,240+0100 INFO pdflatex - starting with command line: pdflatex.exe -synctex=1 -interaction=nonstopmode -enable-write18 TeX-TikZ-slow-MWE.tex
2019-03-05 13:21:31,246+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:21:31,246+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:21:31,246+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:21:33,607+0100 INFO pdflatex - executing write18 shell command: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname "figtemp/TeX-TikZ-slow-MWE-figure0" "\def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}"
2019-03-05 13:21:33,885+0100 INFO pdflatex - starting with command line: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname figtemp/TeX-TikZ-slow-MWE-figure0 \def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}
2019-03-05 13:21:33,891+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:21:33,891+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:21:33,891+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:21:36,177+0100 INFO pdflatex - finishing with exit code 0
2019-03-05 13:21:36,326+0100 INFO pdflatex - executing write18 shell command: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname "figtemp/TeX-TikZ-slow-MWE-figure1" "\def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}"
2019-03-05 13:21:36,614+0100 INFO pdflatex - starting with command line: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname figtemp/TeX-TikZ-slow-MWE-figure1 \def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}
2019-03-05 13:21:36,619+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:21:36,620+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:21:36,620+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:21:39,167+0100 INFO pdflatex - finishing with exit code 0
2019-03-05 13:21:39,311+0100 INFO pdflatex - executing write18 shell command: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname "figtemp/TeX-TikZ-slow-MWE-figure2" "\def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}"
2019-03-05 13:21:39,583+0100 INFO pdflatex - starting with command line: pdflatex -enable-write18 -halt-on-error -interaction=batchmode -jobname figtemp/TeX-TikZ-slow-MWE-figure2 \def\tikzexternalrealjob{TeX-TikZ-slow-MWE}\input{TeX-TikZ-slow-MWE}
2019-03-05 13:21:39,592+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:21:39,592+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:21:39,592+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:21:41,817+0100 INFO pdflatex - finishing with exit code 0
2019-03-05 13:21:42,029+0100 INFO pdflatex - finishing with exit code 0
2019-03-05 13:21:42,485+0100 INFO pdflatex - starting with command line: pdflatex.exe -synctex=1 -interaction=nonstopmode -enable-write18 TeX-TikZ-slow-MWE.tex
2019-03-05 13:21:42,489+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:21:42,489+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:21:42,489+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:21:45,223+0100 INFO pdflatex - finishing with exit code 0
second run, using the externalized images
Total time: ~2.4 s
2019-03-05 14:15:03,628+0100 INFO pdflatex - starting with command line: pdflatex.exe -synctex=1 -interaction=nonstopmode -enable-write18 TeX-TikZ-slow-MWE.tex
2019-03-05 14:15:03,629+0100 INFO pdflatex - allowing known shell commands
2019-03-05 14:15:03,629+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 14:15:03,629+0100 INFO pdflatex - allowing all shell commands
2019-03-05 14:15:06,080+0100 INFO pdflatex - finishing with exit code 0
Externalization disabled
Total time: ~5.1 s
2019-03-05 13:23:19,734+0100 INFO pdflatex - starting with command line: pdflatex.exe -synctex=1 -interaction=nonstopmode -enable-write18 TeX-TikZ-slow-MWE.tex
2019-03-05 13:23:19,742+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:23:19,742+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:23:19,742+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:23:22,045+0100 INFO pdflatex - finishing with exit code 0
2019-03-05 13:23:22,476+0100 INFO pdflatex - starting with command line: pdflatex.exe -synctex=1 -interaction=nonstopmode -enable-write18 TeX-TikZ-slow-MWE.tex
2019-03-05 13:23:22,485+0100 INFO pdflatex - allowing known shell commands
2019-03-05 13:23:22,485+0100 INFO pdflatex - enabling input (output) from (to) processes
2019-03-05 13:23:22,485+0100 INFO pdflatex - allowing all shell commands
2019-03-05 13:23:24,842+0100 INFO pdflatex - finishing with exit code 0
Conclusion
Externalizing my three (very simple) TikZ-Images blows up compilation time almost by a factor of 3 in the first run.
When using a tool like TikzEdt, all my TikZ-images compile in a split second.
What can I do, to speed this up?
Edit:
I found out that TikzEdt uses a precompiled .fmt
file, what makes it so fast. As I've got no experience in precompiling, I could use some help for this and how to pass it to the tikzexternalize
calls of pdflatex
. In this question someone is tryin the same, but I can't seem to organize my preamble to work as desired and meanwhile speed up the externalized image compilation.
\tikzexternalize \usepgfplotslibrary{external}
in the wrong order. On my PC this actually gives me anUndefined Control Sequence
. Also, again. tikzexternalize is not expected to give any speed improvements the when it actually re-draws the tikz pictures. So it would be good if you could tell us how long it takes if you compile it a second time without changing the pictures. If this is the same, this would suggest thattikzexternalize
fails to recognize that the image has not changed