背景
Assembly-CSharp から Addressable Definition(以下、asmdef)に定義されたクラスを扱うには、asmdef の Auto Referenced を有効にして、毎回コンパイルする必要があります。
私は、多くのコードが書かれたクラスを毎回コンパイルするのは無駄だと思い、C のヘッダーのようなクラス(以下、ヘッダ的クラス)を作る事を考えました。多くのコードが書かれたクラスの Auto Referenced を無効にして、代わりにヘッダ的クラスの Auto Referenced を有効にする事で、コンパイルするコードの量を減らし、コンパイル時間を短くできないかという案です。
ヘッダ的クラスの実装が有効か判断するため、ヘッダ的クラスの有無がコンパイル時間に影響するか検証することにしました。
ヘッダ的クラスとは
他のクラスの関数を呼び出すだけのクラスを指します(このようなクラスには名前があるかもしれません)。実装がないのでコード量も少ないです。
計測方法
コンパイル時間の測定には、baba-s さんの CompileTimeMeasurer を使わせていただきました(使うにあたり、ログ表示を改造しました)。
多くのコードが書かれたクラスを再現するために、適当な関数を1000個入れたクラス Body を用意しました(Google スプレッドシートで作りました)。
コンパイルを走らせるために CompileTest というクラスを作りました。Body の関数である Function1() と Function2() を交互に書き換えて保存し、コンパイルを実行します(スクリプトが Editor に反映されるまでの時間は多少前後するので、手動で Refresh して誤差を減らしました)。
まずは、asmdef なしで20回計測しました(左から、回数,コンパイル時間,累計コンパイル時間)。
次に、Body の asmdef を作成し、Auto Referenced を有効にして20回計測しました。
Body を asmdef に入れて、変更を加えなかったので、コンパイル時間が短くなりました。
最後に、Header を作り Body の代わりに Auto Referenced を有効にして20回計測しました。
(どうでもいいですが、CompileTest の Body.Function を Header.Function に変えたり、Header.asmdef の asmdef References に Body.asmdef を追加したりもしました)
逆に遅くなってしまいました😇
計測結果
左から、asmdefなし、Bodyのみ、Header利用の測定結果です。ヘッダ的クラスの利用は逆効果だと分かりました。
まとめ
ヘッダ的クラスはダメでしたが、スクリプトを asmdef で定義すればコンパイルが速くなると実感できました(当然)。
私のような発想に至った人がこの記事を見て、ヘッダ的クラスは無意味だと知ってくれれば幸いです。