Дорого ли vpacks?: выполнение точного измерения производительности/профилирования с использованием смешанного кода latex и luatex

Дорого ли vpacks?: выполнение точного измерения производительности/профилирования с использованием смешанного кода latex и luatex

Как выполнить точное измерение производительности с помощью смешанного кода latex, luatex? Допустим, есть два блока кода, выполняемых один за другим. Первый из них в простом latex, а второй — luatex. Я хотел бы узнать реальные накладные расходы на добавление второго фрагмента кода. Тестовый случай, который приходит на ум, — это выполнение vpack на существующем vbox, который изначально не был установлен на размер его содержимого. Насколько затратен vpack по сравнению с созданием vbox? Это то, что мне на самом деле интересно узнать, особенно для огромных vbox, например. Вот мой код, которому нужны вставки таймера производительности (в отмеченных местах):

(Примечание: игнорируйте значение «Естественная высота» tempvbox, оно неверно, так как высота превышает ограничение tex. Конечно, вы можете увидеть правильное значение, уменьшив количество абзацев в blindtext с 1000 до чего-то меньшего, хотя это также снизит точность соотношения двух рассматриваемых временных дельт.)

% >> 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}

Скриншот вывода:

снимок экрана скомпилированного вывода

решение1

На основе предложений Марселя Крюгера и Патрика Гундлаха (topskip), с некоторыми дополнениями и тестированиями, вот окончательный код и наблюдения:

Для абзацев длиной в несколько строк ( \blindtext[1]), vpack тратит от 2% до 10% времени, затраченного на создание соответствующего vbox. По мере увеличения количества строк ( \blindtext[1000]или цикла с \blindtext[1]\par\blindtext[1]\par...), процент времени, затраченного vpack по сравнению с созданием vbox, продолжает уменьшаться (поскольку \blindtext[1000]он составляет порядка 0,01% времени, затраченного на создание vbox). В любом случае, процентное соотношение vpack кажется незначительным, поскольку можно было бы ожидать, что создание vbox имеет сложность O(n^2), а vpack, вероятно, 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}

Скриншот:

Скриншот скомпилированного вывода

Связанный контент