初めに
関数定義をcpp/ccファイルに書くか、h/hppに書くかたまに悩むことがあると思うんですが、コンパイル速度的にはどうなんよ、ということで検証しました。
調査対象
定義をヘッダーに書いていたもの
https://github.com/YSRKEN/KanColleSimulator_KAI/commit/7a37a02343c224018c3962aa04addad0c77894c4
定義をcppファイルに移したもの
https://github.com/YSRKEN/KanColleSimulator_KAI/commit/a14223991c37a1eb64c4df4d97fedd47db3c1ac5
使うコンパイラ
- Visual Studio 2015 community Update 1
- Visual Studio 2015 community Update 1 Clang with Microsoft CodeGen (January 2016) (clang3.7)
この2つのコンパイラ ✕ x86/x64 ✕ Debug(-O0)/Release(-O2)
の計8通りの構成を作り、VSのバッチビルド機能ですべてリビルドした時間を測定
測定環境
計測方法
アマレコTVを用いてコンパイル時のlogウィンドウを録画する。録画コーデックはUtVideo Codec Suite 15.3.0 YUV420 BT.709 VCM。
これをAviUtlにて取り込みカット編集、AviUtlに表示される総時間と総frame数を記録する。なおAviUtlの読み込みプラグインにはL-SMASH Works File Reader r785を利用した
結果
ヘッダーに定義を書いたもの 3:58.59[7158frame]
cppに定義を書いたもの 3.57.80[7134frame]
有意な差は出なかった(ヘッダーに書くと+0.3%コンパイル時間増加した)
結論
コンパイラは十分優秀なのでどっちでもいいんじゃないか。
templateが絡む関数を公開するととどうせヘッダーに書くしか無いのだから、ヘッダーに定義を書くことへの罪悪感をもし持っている人がいたら少しは減ったかな?
他のコンパイラでも(gccとかgccとかgccとか)多分同じなんじゃなかろうか。