やっぱりLuaLaTeXが遅い件について
昨年のアドベントカレンダーでは「重点解説! LuaLaTeXを遅くしない方法」と題してLuaLaTeXがフツーよりも遅くなる原因とその解決方法について解説しました。
- 重点解説! LuaLaTeXを遅くしない方法(Qiita)
- 重点解説! “DockerでLuaLaTeX”を遅くしない方法(Qiita)
さてこれで「LuaLaTeXが遅すぎる」問題が解決したのかというと、もちろん全くそんなことはありません。ご存じの通り、LuaLaTeXはフツーでも極めて遅いからです😥 そして当該の記事の背景解説でも述べた通り、この状況を改善する簡単な方法は見当たりません😥
さらに悪いことに近年の「タグ付PDF対応」などの機能拡張によって、LaTeXカーネル自体の動作が年を追うごとにどんどん遅くなっています😰 最も深刻なのは、LaTeXチームが「LaTeXカーネルがフルサポートする対象のエンジンをLuaTeXに限定する」という方向性を打ち出していることです😭
結局、タグ付PDFサポートについては
— 某ZR(ざんねん🙃) (@zr_tex8r) 2024年11月8日
「XeTeXは無理ぽ」
「pdfTeXも数式がうまくいきません」
「エッ(u)pTeX? 何それ?」
「皆さん、LuaTeXしましょう!💁💁💁」
ということらしい😲#TeX #TeXLaTeX
※タグ付PDFサポートの話(念のため)
もはや、我々には“思い切り遅いLuaLaTeX”を使うことしか道は残されていないのでしょうか😭
LuaLaTeXの遅さを画期的に解決したい件
この「LuaLaTeXが遅すぎる」というのは明らかに困難な問題です。しかしまさに今、我々はこの問題が「LaTeXの困難な問題」であることを把握しました。それが把握できていれば、画期的な方向からの解決を検討すべきことがわかります。……そうです。
LuaLaTeXの出力を☃に変えればよい。
LuaLaTeXはunicode対応が充実しているため、さまざまな種類の文字(数式も含む)が出力できますが、一方で、そのためのOpenTypeフォント関連の処理1がLuaLaTeXの遅さの原因になっていることは確かです。日本語とか英語とか数式とかの文字を排して本質的な出力に徹することにより遅さの原因が解消されることは十分に期待できるでしょう。
LuaLaTeXの遅さを画期的に解決する件
というわけで、LuaLaTeXを高速化するための設定ファイルをつくってみました😃
- LuaLaTeXを爆速にする設定ファイル(※ただし画期的)(Gist/zr-tex8r)
使い方はとても簡単です。設定ファイル2scspeedy.luaをカレントディレクトリに置いた上で、lualatex
コマンドのオプションに--lua=scspeedy.lua
を追加するだけです。
lualatex --lua=scspeedy.lua ‹文書ファイル›
実際にLuaLaTeXを爆速にしてみる
例として、昨年のDockerの記事で使った文書ファイルをタイプセットしてみましょう。
% LuaLaTeX文書; 文字コードはUTF-8 \documentclass[a4paper]{ltjsarticle} \usepackage{bxjalipsum}% 例のアレ \begin{document} \section{吾輩は猫である} %『吾輩は猫である』の先頭の10段落を出力 \jalipsum[1-10]{wagahai} \end{document}
まずはこの文書をフツーのLuaLaTeXでタイプセットしてみます。
> lualatex test.tex This is LuaHBTeX, Version 1.18.0 (TeX Live 2024) restricted system commands enabled. (./test.tex LaTeX2e <2024-11-01> patch level 1 L3 programming layer <2024-11-02> (c:/texlive/2024/texmf-dist/tex/luatex/luatexja/ltjsarticle.cls Document Class: ltjsarticle 2023/07/26 ltjsclasses ………(中略)……… Output written on test.pdf (3 pages, 166156 bytes). Transcript written on test.log.
いつも通りの遅いLuaLaTeXです。自分の環境では大体15秒かかりました😫 出力結果(の1ページ目)は以下のような感じです。test.texはこのレイアウト(A4判)で2ページ半の分量をもっています。
同じ文書を、今度はscspeedy.luaを有効にしてタイプセットしてみます。
> lualatex --lua=scspeedy.lua test.tex This is LuaHBTeX, Version 1.18.0 (TeX Live 2024) restricted system commands enabled. (./test.tex [1]) 270 words of node memory still in use: 1 hlist, 39 glue_spec nodes avail lists: 1:1,2:12,3:136,4:4,5:2,9:1 Output written on test.pdf (1 page, 1832 bytes). Transcript written on test.log.
実際にやってみれば判りますが、LuaLaTeXなのに爆速でタイプセットが完了します😲 自分の環境では大体2.5秒でした。scspeedy.luaの効果は抜群であることがわかります。
念のため、出力のPDFも確認してみましょう。
この通り、本質的な内容がしっかりと維持されていて、しかも素敵になっています😊
爆速のLuaLaTeXをもっと比較してみる
せっかく爆速のLuaLaTeXを手に入れたので、どれだけ速いのかをもう少し計測してみましょう。次の4つのパターンについてタイプセットのの所要時間を計測します。
- ①フツーの(遅い)LuaLaTeXでtest.texをタイプセットする。
- ②pLaTeX+dvipdfmxでtest1.texをタイプセットする。
※test1.texはtest.texをpLaTeX+dvipdfmx用に修正したもの。 - ③pdfLaTeXでtest2.texをタイプセットする。
※test2.texは「Hello, world!」だけの欧文文書🙃 - ④爆速のLuaLaTeXでtest.texをタイプセットする。
※test1.texはtest.texの先頭の2行を以下の内容に変更したものです。
% pLaTeX+dvipdfmx \documentclass[dvipdfmx,a4paper]{jsarticle}
※test2.texの内容は以下の通りです。
\documentclass[a4paper]{article} \begin{document} Hello, world! \end{document}
結果は以下のようになりました。
パターン | 所要時間 |
---|---|
①フツーのLuaLaTeX | 15.93±0.12 秒 |
②pLaTeX+dvipdfmx | 9.02±0.35 秒 |
③pdfLaTeX | 3.16±0.09 秒 |
④爆速のLuaLaTeX | 2.33±0.07 秒 |
※環境はWindows10上のTeX Live 2024です。
※10回実行して平均と標準偏差を求めました。
なんと、「LuaLaTeXが一番速いLaTeXエンジンである」という結果になりました。やっぱり☃の力はスゴイ!😲
まとめ
もはやLuaLaTeXの遅さを気にする必要はなくなりました! 安心して本質的⛄なLuaLaTeXで素敵😊な文書をドンドン作りましょう!💁