文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

GAE/Java8+kotlin+Spark Frameworkでスピンアップからjsonが返るまでの速度をゆる〜く確認する

前回GAE/Golangでやったやつを、只今絶賛ベータ版のjava8で試してみましたよ〜


f:id:treeapps:20170917230836p:plain

www.bunkei-programmer.net

こちらが前回の記事です。

前回は速い速いと言われていたGAE/Golangのスピンアップから起動までの速度をゆる〜く計測してみました。

そして今回は、ついにベータとなったGAE/Java8(勿論スタンダード版です)を試してみることにしました。
cloudplatform-jp.googleblog.com

GAE/Java8

GCPのGAE管理画面では、こんな感じの表示になります。

f:id:treeapps:20170924204218p:plain

ちなみにですが、2017年09月現在ではどうもインスタンス数がバグってる???ようで、実際はインスタンス数が0なのに、バージョンメニューでは何故かインスタンス数が3等と表示されたりして、ちょっと安定していないっぽいです。(このテスト時はファイヤーウォールで自分のIP以外は全部弾いてるのでリクエストは届かない筈なのに・・)

という事で、早速計測してみました。

計測の仕方

バージョンメニューのインスタンス数が0になってからテストしようと思ったのですが、バグってるっぽく0になりにくいようなので、計測前はインスタンスメニューで手動でインスタンスを削除、必ずスピンアップが発生するようにしています。

環境

今回の計測環境は以下の通りです。

IDE IntelliJ IDEA Ultimate v2017.2.4
GAE Runtime Java8 beta
ビルド・デプロイ Gradle v4.2
Language kotlin v1.1.4-3
Framework Spark Framework v2.6.0
GAEリージョン asia-northeast1

スピンアップしてフレームワークを初期化してjsonが返るまでの速度

前回やったのと同じです。インスタンスが0のスピンダウンした状態からリクエストを受け、実際にフレームワークがjsonを返し終えるまでの時間を計測します。

計測1回目

f:id:treeapps:20170924210337p:plain

計測2回目

f:id:treeapps:20170924210400p:plain

計測3回目

f:id:treeapps:20170924210416p:plain

計測4回目

f:id:treeapps:20170924210437p:plain

計測5回目

f:id:treeapps:20170924210458p:plain

結果と平均値まとめ

1回目 2回目 3回目 4回目 5回目 平均値
5.16秒 5.33秒 5.58秒 5.07秒 5.24秒 5.276秒

結果は平均 5.276秒 となりました。

では前回計測した、GAE/Gonalg + gin、GAE/Java7 + servletと比較してみましょう。

ランタイム 1回目 2回目 3回目 4回目 5回目 平均値
java8 + spark fw 5.16秒 5.33秒 5.58秒 5.07秒 5.24秒 5.276秒
java7+servlet 3.65秒 3.40秒 3.82秒 3.78秒 3.94秒 3.718秒
go+gin 0.506秒 0.377秒 0.601秒 0.501秒 0.494秒 0.495秒


う〜ん、GAE/Golang速っ!!!


しかし今回のJava8の計測結果はSpark frameworkを介した結果です。java7 + servletとjava8 + sparkの平均値を比較すると、 5.276秒 - 3.718秒 = 1.558秒 となり、sparkの方が遅いですが、実はこれは驚異的なスピードです。

JavaのフレームワークにはstrutsやSpringBoot等がありますが、どれもstartupが完了するまでに長い時間がかかります。SpringBootの場合はGAEでなくても20〜30秒かかります。それを考えると、Spark Frameworkのstartupにかかる時間は驚異的です。

sparkjava.com

おまけ1:Spark Frameworkのstartupにかかる時間

ついでに計測しときましょうか。計測環境はローカルです。

ソースコードは1ファイルのみで、80行程度しか無いクラスを用意した状態で、コンソールに表示された起動時間を見てみます。

1回目 2回目 3回目 4回目 5回目 平均値
620ms 578ms 584ms 568ms 593ms 588.6ms

Javaのフレームワークでは最速の部類なのではないでしょうか。平均startup時間は 588.6ミリ秒 となりました。秒ではなくミリ秒です。1秒以下です。

おまけ2:スピンアップ後にjsonを返す速度

スピンアップとフレームワークの初期化が無い状態だとどのくらいの速度でしょうか。計測してみます。

f:id:treeapps:20170924215036p:plain
f:id:treeapps:20170924215047p:plain
f:id:treeapps:20170924215056p:plain
f:id:treeapps:20170924215105p:plain
f:id:treeapps:20170924215115p:plain

1回目 2回目 3回目 4回目 5回目 平均値
49ms 41ms 26ms 92ms 66ms 54.8ms

平均は 54.8 となりました。中々速いです。

が、Golang + ginの場合は20ms前後でjsonが返るので、golangよりは遅いです。

雑感

確かにGAE/Golangは速いです。

実際私はその速さを利用し、以下のサイトをGAE/Golang + reactを利用し、高速なSPAサイトを開発しています。

www.tree-maps.com

スピンアップ速度は当然ミリ秒で、フレームワークの初期化もミリ秒です。全部合計してようやく1秒いくかいかないか、程度です(GAE上にも関わらず)

しかしですね・・・・

Golangは書き難い!書いていて全く楽しくない!辛い!苦しい!

のです。

そこでJavaです。満場一致で何故かみんな大嫌いなJavaですよ。

といっても素のJavaではなく、kotlinで書きます。scalaとはまた違ったJVM系言語で、今後非常にシェアを伸ばすであろう期待の言語です。

そのkotlinでマイクロフレームワークであるSpark frameworkを動かすわけです。

GAEの世界ではデブデブなフルスタックフレームワークではスピンアップ時に地獄を見る事になるので、今回のJava8対応でSpark frameworkが解禁された事は非常に喜ばしいです。

リニューアル前のtree-mapsはGAE/Java7 + play framework v1で開発していましたが、これがまた初期化が遅い・・・スピンアップからjsonを返すまで、余裕で10秒以上かかっていました。もう地獄の遅さです。2000年くらいのテレホーダイ回線かこれ!?と言いたくなる程の遅さでした。

そして今kotlin + spark frameworkです。今回はスピンアップからjsonを返すまでが約5.2秒となり、ギリッギリ許容できる?時間かと思います。

好きな人以外には拷問に等しいGolangで書くよりは、kotlin + spark frameworkの方がテンション上がる人の方が多い(と思いたい)でしょうから、今後GAE/Java8が増えて、早急なJava9対応を期待したいですね。

つい先日GAを迎えたjava9はJVMの起動時間の短縮やメモリ消費量削減等のパワーアップをしており、もしこれがGAEに乗ったら、Golangに更に追いつく事も夢ではないかもしれません(いや、多分夢だけど)。

とはいえ最近ではSPAサイトが増えた事でサーバサイドでゴリゴリする事も減り、jsでゴリゴリする機会の方が多く、書き難くてもGolangで何とか頑張る事はできます。実際tree-mapsではtitle・descriptionをサーバサイドレンダリングしたり、googlemapの言語コードをjsonで返すくらいしかGolangを使っていません。

今作っている新サイトもAngular4で、ロジックはjs(typescript)側でゴリゴリして、サーバサイドはSEO製造機と化す予定です。そうなるとGolangとjava8のどちらがいいか?と言われれば、速度的には断然Golangですが、テンション的にはjava8 + kotlinですね。やはり。