前回GAE/Golangでやったやつを、只今絶賛ベータ版のjava8で試してみましたよ〜
こちらが前回の記事です。
前回は速い速いと言われていたGAE/Golangのスピンアップから起動までの速度をゆる〜く計測してみました。
そして今回は、ついにベータとなったGAE/Java8(勿論スタンダード版です)を試してみることにしました。
cloudplatform-jp.googleblog.com
GAE/Java8
GCPのGAE管理画面では、こんな感じの表示になります。
ちなみにですが、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回目
計測2回目
計測3回目
計測4回目
計測5回目
結果と平均値まとめ
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にかかる時間は驚異的です。
おまけ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を返す速度
スピンアップとフレームワークの初期化が無い状態だとどのくらいの速度でしょうか。計測してみます。
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サイトを開発しています。
スピンアップ速度は当然ミリ秒で、フレームワークの初期化もミリ秒です。全部合計してようやく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ですね。やはり。