¿Son caros los vpacks?: realizar mediciones/perfiles de rendimiento de grano fino con código mixto de látex y luatex

¿Son caros los vpacks?: realizar mediciones/perfiles de rendimiento de grano fino con código mixto de látex y luatex

¿Cómo realizar una medición del rendimiento de grano fino con látex mixto, código luatex? Digamos que hay dos bloques de código, ejecutados uno tras otro. El primero es de látex simple y el segundo es de luatex. Me gustaría saber el costo real de agregar el segundo fragmento de código. Un caso de prueba que me viene a la mente es hacer un vpack en un vbox existente que originalmente no estaba configurado para el tamaño de su contenido. ¿Qué tan caro es un vpack en comparación con la creación de vbox? Eso es algo que realmente me interesa saber, especialmente para vboxes grandes, por ejemplo. Aquí está el código que necesita inserciones del temporizador de rendimiento (en ubicaciones marcadas):

(Nota: ignore el valor de "altura natural" de tempvbox, es incorrecto ya que la altura excede el límite de texto. Por supuesto, puede ver un valor correcto reduciendo el número de párrafos en el texto ciego de 1000 a algo pequeño, aunque eso también reducirá la precisión. de la relación de dos deltas de tiempo en consideración.)

% >> 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 pantalla de la salida:

captura de pantalla de la salida compilada

Respuesta1

Basado en sugerencias de Marcel Krüger y Patrick Gundlach (topskip), con algunas adiciones y pruebas, aquí está el código final y las observaciones:

Para párrafos que tienen unas pocas líneas ( \blindtext[1]), vpack tarda entre el 2% y el 10% del tiempo necesario para la creación de su respectivo vbox. A medida que aumenta el número de líneas ( \blindtext[1000]o un bucle con \blindtext[1]\par\blindtext[1]\par...), el porcentaje de tiempo que tarda vpack en comparación con la creación de vbox sigue disminuyendo (ya que \blindtext[1000]es del orden del 0,01% del tiempo necesario para la creación de vbox). De cualquier manera, el porcentaje de vpack parece insignificante, ya que uno podría esperar que la creación de vbox sea de complejidad O (n ^ 2) y vpack probablemente de complejidad 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 pantalla:

Captura de pantalla del resultado compilado

información relacionada