
Como fazer medição de desempenho de grãos finos com látex misto e código luatex? Digamos que existam dois blocos de código, executados um após o outro. O primeiro é em látex simples e o segundo é luatex. Gostaria de saber a sobrecarga real de adicionar o segundo trecho de código. Um caso de teste que vem à mente é fazer um vpack em um vbox existente que não foi originalmente definido para o tamanho de seu conteúdo. Quão caro é um vpack em comparação com a criação de vbox? Isso é algo que estou realmente interessado em saber, especialmente para vboxes enormes, por exemplo. Aqui está o código que precisa de inserções de temporizador de desempenho (em locais marcados):
(Nota: Ignore o valor de "Altura natural" de tempvbox, está incorreto porque a altura excede o limite do tex. É claro que você pode ver um valor correto reduzindo o número de parágrafos no texto cego de 1000 para algo pequeno, embora isso também reduza a precisão da proporção de dois deltas de tempo em consideração.)
% >> 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}
Captura de tela da saída:
Responder1
Com base nas sugestões de Marcel Krüger e Patrick Gundlach (topskip), com algumas adições e testes, aqui está o código final e observações:
Para parágrafos com poucas linhas ( \blindtext[1]
), o vpack leva de 2% a 10% do tempo gasto na criação de seu respectivo vbox. À medida que o número de linhas aumenta ( \blindtext[1000]
ou um loop com \blindtext[1]\par\blindtext[1]\par...
), a porcentagem de tempo gasto pelo vpack em comparação com a criação do vbox continua diminuindo (pois \blindtext[1000]
é da ordem de 0,01% do tempo gasto para a criação do vbox). De qualquer forma, o vpack em termos percentuais parece insignificante, já que se poderia esperar que a criação do vbox tenha complexidade O (n ^ 2) e vpack provavelmente complexidade O (n).
\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}
Captura de tela: