← Spring コース
58. ビルドが遅いと言われる理由を測って分ける
依存を取得済みの状態で、 は5回中4回が2.32秒でした。ログの時刻から分けると、 を起動するテストが約1.1秒、 の起動と (設定ファイル)の読み込みが約0.7秒、コンパイルが約0.3秒、 の作成が約0.2秒です。 だけを直接呼ぶと0.31〜0.33秒でした。
時間が大きく出たのは別の場所です。空の状態からの初回は100秒、57秒、221秒で、CPU 時間は3回とも13秒台だったので、差は待ち時間(主にネットワークと考えられます)です。Maven は何も変えなくても2.0秒、無しの は4.2〜4.5秒でした。依存もソースからコンパイルする Rust は、取得済みのが5.5秒でした(release、CPU 10 で並列、CPU 時間は約26秒)。
この数字は、ソース2ファイル・テスト1本のアプリを、 の (CPU 10、メモリ 8GB)で他の作業の負荷もある中で測ったものです。大規模なプロジェクトの時間は測っておらず、ここから速いとも遅いとも言えません。遅いと聞いたら、初回か2回目以降か、ダウンロードかテストかコンパイルかを分けて確かめるのが出発点です。
点線の付いた語はタップすると説明が出ます。用語集を開く →
Maven の起動と POM の読み込み約0.7秒(30%)
何もしない mvn validate でも 0.60〜0.61 秒javac を呼ぶ
コンパイル約0.3秒(13%)。本体2ファイル + テスト1ファイル
別の JVM で Spring を起動する
テスト約1.1秒(48%)。@SpringBootTest が1本
-DskipTests を付けると全体は 1.25 秒JAR にまとめる
jar と repackage約0.2秒(8%)
この2.32秒の外側で大きかったもの
初回のビルド(依存の取得込み)壁時計 57〜221秒(533ファイルを取得)
デーモン無しの Gradle4.2〜4.5秒(有りなら 1.5〜1.9秒)
- ・割合は 2.32 秒に対するおおよその値で、JVM の起動だけなら java -version で約 10 ms でした
- ・Spring に依存しない合成ソースでは、javac は 8,300 行で 0.41 秒前後、415,000 行で 2.35〜2.43 秒でした。実際の大規模プロジェクトの値ではありません
- ・題材はソース2ファイル・モジュール1個・テスト1本です。ここから大規模プロジェクトの時間は言えません
サンプルコード(フレームワーク環境が必要なため表示のみ)
// DemoApplicationTests.java — start.spring.io が最初から付けてくるテスト(Spring Boot 4.1.1)
// 中身は空だが、@SpringBootTest が付いているので、実行すると Spring のコンテナが丸ごと起動する
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
// ./mvnw -B clean package のログから(依存取得済み・2回目の実行)
// 13:26:02.562 [INFO] --- surefire:3.5.6:test (default-test) @ demo ---
// 13:26:02.877 [INFO] Running com.example.demo.DemoApplicationTests
// ... Started DemoApplicationTests in 0.385 seconds (process running for 0.74)
// 13:26:03.668 [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.785 s -- in com.example.demo.DemoApplicationTests
// 13:26:03.679 [INFO] --- jar:3.5.1:jar (default-jar) @ demo ---
//
// surefire:test の区間は 1,117 ms。ビルド全体 2.32 秒の約半分を、この空のテスト1本が占めた。
// 内訳は、テスト用の JVM の起動、JUnit の起動、Spring のコンテナの起動(0.385 秒)。
// 同じビルドで javac が2ファイルをコンパイルした区間は 247 ms だった。
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗