
혼합 라텍스, 루아텍스 코드로 미세한 입자 성능 측정을 수행하는 방법은 무엇입니까? 두 개의 코드 블록이 차례로 실행된다고 가정해 보겠습니다. 첫 번째는 일반 라텍스이고, 두 번째는 루아텍스입니다. 두 번째 코드를 추가할 때 발생하는 실제 오버헤드를 알고 싶습니다. 마음에 드는 테스트 사례는 원래 내용의 크기로 설정되지 않은 기존 vbox에서 vpack을 수행하는 것입니다. vbox 생성에 비해 vpack은 얼마나 비쌉니까? 그것은 특히 예를 들어 거대한 vbox에 대해 제가 실제로 알고 싶은 것입니다. 성능 타이머 삽입이 필요한 코드는 다음과 같습니다(표시된 위치에).
(참고: tempvbox의 "자연 높이" 값을 무시하십시오. 높이가 tex 제한을 초과하므로 올바르지 않습니다. 물론 블라인드 텍스트의 단락 수를 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%이기 때문입니다). 어느 쪽이든, vbox 생성은 O(n^2) 복잡성이고 vpack은 아마도 O(n) 복잡성일 것으로 예상할 수 있으므로 백분율 현명한 vpack은 중요하지 않은 것 같습니다.
\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}
스크린샷: