JSUG のLT会で 『Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた』というタイトルでLTしてきたところ、 Spring 5 から @Component
のインデックススキャンがサポートされるようになったことを教えてもらったので、試してみました。
追加するライブラリー
以下のとおり、アノテーションプロセッサーにライブラリーを追加します。
annotationProcessor('org.springframework:spring-context-indexer')
あとは普通にビルドするだけです。
なおビルドすると、 /META-INF
の下に spring.components
というファイルができます
中身はこんな感じです(一部抜粋)
# #Wed Apr 18 23:17:29 JST 2018 com.example.jpa.repository.baz.BazRepository=org.springframework.stereotype.Component,org.springframework.data.repository.Repository com.example.jpa.entity.def.DefEntity=javax.persistence.Entity,javax.persistence.Table com.example.jpa.repository.waldo.WaldoRepository=org.springframework.stereotype.Component,org.springframework.data.repository.Repository com.example.App=org.springframework.stereotype.Component com.example.jpa.entity.garply.GarplyEntity=javax.persistence.Entity,javax.persistence.Table
起動時間の比較
では、早速比較してみます。
slow
というプロジェクトが何もしないままのプロジェクトindexed
というプロジェクトがslow
プロジェクトをコピーしてインデックススキャンを有効にしたプロジェクト
次のスクリプトを実行します
#!/usr/bin/env bash set -e ./gradlew slow:clean slow:bootJar indexed:clean indexed:bootJar echo slow java -jar slow/build/libs/slow-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g" echo indexed java -jar indexed/build/libs/indexed-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g" echo slow java -jar slow/build/libs/slow-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g" echo indexed java -jar indexed/build/libs/indexed-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g" echo slow java -jar slow/build/libs/slow-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g" echo indexed java -jar indexed/build/libs/indexed-0.0.1-SNAPSHOT.jar 2>/dev/null | grep "JVM running for" | sed -e "s/^.*Started App//g"
実行結果は次のようになりました
BUILD SUCCESSFUL in 4s 10 actionable tasks: 10 executed slow in 6.723 seconds (JVM running for 7.572) indexed in 6.012 seconds (JVM running for 6.875) slow in 6.059 seconds (JVM running for 6.889) indexed in 6.129 seconds (JVM running for 6.996) slow in 6.057 seconds (JVM running for 6.874) indexed in 6.025 seconds (JVM running for 6.924)
- 何もしない場合の起動時間 :
6.280 sec
- インデックスつけた場合の起動時間 :
6.055 sec
という感じで、少し速くなりました。が、2回目などは遅くなっている場合もあり、もう少し大きめなプロジェクトで試してみたい気もします