Dev Study
← 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回目以降か、ダウンロードかテストかコンパイルかを分けて確かめるのが出発点です。

点線の付いた語はタップすると説明が出ます。用語集を開く →

mvn clean package 2.32 秒の内訳(依存取得済み・4回の実行のログ時刻から。Maven 3.9.16 / JDK 25)
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つの具体例で確認します。

公式ドキュメントで詳しく ↗