Unity2018.3でのHoloLensビルドのコード最適化設定 (MasterWithLTCGビルド)
Unity2018.3.0f2が正式版として落ちてきましたので早速HoloLensアプリのビルドを試してみました。
MasterWithLTCG ビルド設定
Unityからは普通にVisual StudioのIL2CPP のUWPプロジェクトを書き出すわけですが、VSでビルド設定をReleaseに変更しようとした際に見慣れぬ設定があることに気づきました。
この "MasterWithLTCG" という設定です。
Unityのリリースノートを調べると2018.3.0b9から導入されたもののようです。
そしてLTCGというのは "Link Time Code Generation" 「リンク時コード生成」の略ということがわかりました。
そしてLTCGとはなんぞやということはこちらに書かれていました。意外と古くからある機能なのですね。
Under The Hood: Link-time Code Generation | Microsoft Docs
こちらはオフィシャルなリファレンス。
/LTCG (Link-time Code Generation) | Microsoft Docs
そして "MasterWithLTCG" ビルド設定とはこのLTCGが有効とされるビルドということになります。
LTCGする意味
ここから先は調べてみてきっとそういうことだなと理解したことなので正確ではないかもしれませんw
そもそもHoloLensプロジェクトはIL2CPPのプロジェクトとして出力されていますからコードはIL(Intermediate Language)からC++コードに変換されているわけですが、Masterビルドでのビルドプロセスは下記となります。
これがMasterWithLTCGビルドでは下記になります。
- コンパイラ:各cppファイルがobjファイルに変換される。この時コードオプティマイズも行われる
- リンカ:各obj間の関数呼び出しをインライン化する等のオプティマイズを行う。
- リンカ:各objをマージしてexeファイルとする
なのでMasterWithLTCGビルドの方がリンク時間が長くなるはずです。
実際に計測してみました。
Master 1>Total compilation time: 88144 milliseconds. 1>Total link time: 16372 milliseconds. MasterWithLTCG 1>Total compilation time: 49604 milliseconds. 1>Total link time: 158050 milliseconds.
コンパイル時間が短くなっているのは謎ですがリンク時間は10倍程度長くなっていますので色々頑張っている様子が伺えます。
生成されたDLLファイルのサイズは下記の通り。 単純には言えませんがインライン展開によってマシン語レベルでコードが増えた結果かもしれません。
Master
MasterWithLTCG
まとめ
Unity2018.3でHoloLensプロジェクトを出力した際に現れる"MasterWithLTCG" ビルド設定の効能について書きました。
今回は比較的シンプルなアプリケーションでテストしたため実際に高速化の恩恵を体験することはできていないのですが、最終リリースをこの設定でビルドして少しでも高速化しておくことは意味がありそうだと思いました。
調査の経緯はこちらのツイートにもスレッド化されています。
Unity2018.3でHoloLensプロジェクト書き出すとMasterWithLTCGというConfigurationが現れたんだけどなんじゃろう pic.twitter.com/LJonfqomb7
— Satoshi Maemoto (@peugeot106s16) December 17, 2018