vpack 昂貴嗎?

vpack 昂貴嗎?

如何使用混合乳膠、luatex程式碼進行細粒度性能測量?假設有兩個程式碼區塊,依序執行。第一個是普通乳膠,第二個是 luatex。我想知道添加第二段程式碼的實際開銷。我想到的一個測試案例是在現有的 vbox 上執行 vpack,而該 vbox 最初並未設定為其內容的大小。與創建 vbox 相比,vpack 的成本有多高?這是我實際上有興趣了解的事情,尤其是對於大型 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

根據 Marcel Krüger 和 Patrick Gundlach (topskip) 的建議,經過一些添加和測試,以下是最終程式碼和觀察結果:

對於幾行長的段落 ( \blindtext[1]),vpack 花費的時間是其各自 vbox 創建時間的 2% 到 10%。隨著行數的增加(\blindtext[1000]或帶有 的循環\blindtext[1]\par\blindtext[1]\par...),與 vbox 創建相比,vpack 所花費的時間百分比不斷減少(因為\blindtext[1000]它大約是 vbox 創建所花費時間的 0.01%)。不管怎樣,百分比明智的 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}

螢幕截圖:

編譯輸出的螢幕截圖

相關內容