mike-neckのブログ

Java or Groovy or Swift or Golang

Component の インデックススキャンでどれくらい速くなるか計測してみた #jsug

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回目などは遅くなっている場合もあり、もう少し大きめなプロジェクトで試してみたい気もします