
Wie kann ich eine detaillierte Leistungsmessung mit gemischtem Latex- und Luatex-Code durchführen? Angenommen, es gibt zwei Codeblöcke, die nacheinander ausgeführt werden. Der erste ist in reinem Latex und der zweite in Luatex. Ich würde gerne den tatsächlichen Aufwand für das Hinzufügen des zweiten Codestücks kennen. Ein Testfall, der mir in den Sinn kommt, ist die Ausführung eines Vpacks auf einer vorhandenen Vbox, die ursprünglich nicht auf die Größe ihres Inhalts eingestellt war. Wie teuer ist ein Vpack im Vergleich zur Vbox-Erstellung? Das ist etwas, das mich wirklich interessiert, insbesondere für große Vboxen zum Beispiel. Hier ist mein Code, der Einfügungen von Leistungstimern benötigt (an markierten Stellen):
(Hinweis: Ignorieren Sie den Wert „Natürliche Höhe“ von tempvbox, er ist falsch, da die Höhe das Tex-Limit überschreitet. Sie können natürlich einen korrekten Wert erhalten, indem Sie die Anzahl der Absätze im Blindtext von 1000 auf einen geringen Wert reduzieren, allerdings verringert sich dadurch auch die Genauigkeit des Verhältnisses der beiden berücksichtigten Zeitdeltas.)
% >> lualatex <filename>.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{printlen}
\setlength\parindent{0pt}
\uselengthunit{in}
\begin{document}
% Time1
\newsavebox{\tempvbox}
\setbox\tempvbox=\vbox to 4in{{\hsize=4in \noindent\blindtext[1000]}}
% Time2
\directlua{
tempvboxnatural = node.vpack(tex.getbox('tempvbox').head)
}%
% Time3
Set height of tempvbox: \directlua{tex.sprint("\csstring\%f in",(tex.getbox('tempvbox').height/tex.sp('1in')))}
Natural Height of tempvbox: \directlua{tex.sprint("\csstring\%f in",(tempvboxnatural.height/tex.sp('1in')))}
%Print Time2-Time1, and Time3-Time2 here
Time2-Time1: ??
Time3-Time2: ??
Partial contents of tempvbox:
\vsplit\tempvbox to 6in
\end{document}
Screenshot der Ausgabe:
Antwort1
Basierend auf den Vorschlägen von Marcel Krüger und Patrick Gundlach (topskip), mit einigen Ergänzungen und Tests, ist hier der endgültige Code und die Beobachtungen:
Bei Absätzen mit wenigen Zeilen ( \blindtext[1]
) benötigt vpack 2 bis 10 % der Zeit, die die entsprechende vbox-Erstellung in Anspruch nimmt. Mit zunehmender Zeilenanzahl ( \blindtext[1000]
oder einer Schleife mit \blindtext[1]\par\blindtext[1]\par...
) nimmt der prozentuale Zeitaufwand von vpack im Vergleich zur vbox-Erstellung weiter ab ( \blindtext[1000]
er beträgt etwa 0,01 % der Zeit, die für die vbox-Erstellung benötigt wird). In jedem Fall scheint vpack prozentual unbedeutend, da man davon ausgehen könnte, dass die vbox-Erstellung eine Komplexität von O(n^2) und vpack wahrscheinlich eine Komplexität von O(n) aufweist.
\documentclass[notitlepage,letterpaper]{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{printlen}
\usepackage{tikz}
\setlength\parindent{0pt}
\uselengthunit{in}
\begin{document}
% Time1
\directlua{time1 = os.clock(); texio.write_nl("time = " .. time1)}
\newsavebox{\tempvbox}
\setbox\tempvbox=\vbox to 4in{{\hsize=4in \blindtext[1]}}
% Time2
\directlua{time2 = os.clock(); texio.write_nl("time = " .. time2)}
\directlua{
tempvboxnatural = node.vpack(tex.getbox('tempvbox').head)
}%
% Time3
\directlua{time3 = os.clock(); texio.write_nl("time = " .. time3)}
\directlua{texio.write_nl("(time3-time2)*100/(time2-time1) = " .. (time3-time2)*100/(time2-time1) .. " \csstring\%" )}
Set height of tempvbox: \directlua{tex.sprint(-2,string.format("\csstring\%f in",(tex.getbox('tempvbox').height/tex.sp('1in'))))}
Natural Height of tempvbox: \directlua{tex.sprint(-2,string.format("\csstring\%f in",(tempvboxnatural.height/tex.sp('1in'))))}
%Print Time2-Time1, and Time3-Time2 here
Delta1 (Time2-Time1): \directlua{tex.sprint(time2-time1)}
Delta2 (Time3-Time2): \directlua{tex.sprint(time3-time2)}
(Delta2/Delta1)*100: \directlua{tex.sprint((time3-time2)*100/(time2-time1))} \%
Partial contents of tempvbox:
\vsplit\tempvbox to 6in
\end{document}
Bildschirmfoto: