
如何使用混合乳膠、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}
螢幕截圖: