Os vpacks são caros?: fazendo medição/criação de perfil de desempenho granular com código misto de látex e luatex

Os vpacks são caros?: fazendo medição/criação de perfil de desempenho granular com código misto de látex e luatex

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:

captura de tela da saída compilada

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:

Captura de tela da saída compilada

informação relacionada