Swift 4.2のBatch Modeについて
https://swift.org/blog/swift-4-2-released/ でSupport for batch mode compilation resulting in faster build times
と言及されているものについて。
この件はWWDC 2018のセッションでも紹介がありました: https://developer.apple.com/videos/play/wwdc2018/401
- これまでSwiftのビルドは簡単にまとめると、デバッグビルド(インクリメンタルビルド)では1ファイルずつコンパイル、リリースビルドではWhole Moduleモードと呼ばれるモードで、モジュール内の全ファイルを一度にまとめてコンパイル、という感じであった
- Whole Moduleモードでは、モジュール内で継承されていない
class
はfinal
が付いていなくても、実質的にfinal
扱いするという最適化もできたりする
- Whole Moduleモードでは、モジュール内で継承されていない
- デバッグビルドが1ファイルずつコンパイルするのに比べて、Whole Moduleモードでまとめてコンパイルする方が速いケースがあった
- このcompilation modeは最適化のモードとは分離されていて、
SWIFT_COMPILATION_MODE
というビルド設定で変更できる - 以前まではWhole Module Optimizationと呼ばれる最適化として提供されていたが、Swift 4.1(Xcode 9.3)からcompilation modeと最適化のモードが分離されるようになった
- このcompilation modeは最適化のモードとは分離されていて、
- Swift 4.2からはインクリメンタルビルドにBatch Modeというものが実装され、デバッグビルドでも複数ファイル単位でコンパイルできるようになり、ビルドが高速化した
- batch modeでPRを検索: https://github.com/apple/swift/pulls?q=is%3Apr+batch+mode+is%3Aclosed
SWIFT_ENABLE_BATCH_MODE=NO
というビルド設定を追加するとBatch Modeを無効にできる(以前までの1ファイル単位でのコンパイル)
デバッグビルドが速くなって嬉しいですね。