appengineに待望のNode.js standard environmentが正式リリースされたので、早速計測してみました〜
前回のあらすじ
GAE/Javaは8になってもやはり初動が遅かったのだ。というかGAE/Java1.7とほとんど違いは無かったのだ。
GAE/Goは(javaと比較すると)くっそ速かったのだ。
そしてGAE/Node.jsが出たので計測してみたのだ。
計測の仕方
前回のGAE/Java8の時と同様に、インスタンスを削除して、必ずスピンアップが発生する状態で計測します。
www.bunkei-programmer.net
環境
リージョン | asia-northeast1 |
---|---|
Runtime | Node.js v8 |
Framework | Express v4.16.3 |
計測に使用したソースコード
以下の公式サンプル(最小のhello world)を使用して計測しました。
github.com
javascriptは1ファイルで、以下のように非常に短いコードです。
'use strict'; // [START app] const express = require('express'); const app = express(); app.get('/', (req, res) => { res.status(200).send('Hello, world!').end(); }); // Start the server const PORT = process.env.PORT || 8080; app.listen(PORT, () => { console.log(`App listening on port ${PORT}`); console.log('Press Ctrl+C to quit.'); }); // [END app]
スピンアップしてフレームワークを初期化してテキストが返るまでの速度
前回やったのと同じです。インスタンスが0のスピンダウンした状態からリクエストを受け、実際にフレームワークがテキストを返し終えるまでの時間を計測します。
計測1回目
計測2回目
計測3回目
計測4回目
計測5回目
結果と平均値まとめ
1回目 | 2回目 | 3回目 | 4回目 | 5回目 | 平均値 |
---|---|---|---|---|---|
0.809秒 | 0.572秒 | 0.539秒 | 0.755秒 | 0.583秒 | 0.6516秒 |
結果は平均 0.6516秒 となりました。
では今まで計測した、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秒 |
node.js + express | 0.809秒 | 0.572秒 | 0.539秒 | 0.755秒 | 0.583秒 | 0.6516秒 |
golangが最速ではありますが、node.jsはgolangより0.2〜0.3秒程度遅いだけなので、十分なパフォーマンスが出ているように見えますね。
雑感
思ったよりGAE/Node.jsが高速で良かったです!
GAE/Node.jsは最近Googleが発表された軽量コンテナ環境のgVisorが使われているそうですが、特に遅い事もなく、非常に良い印象です。
現状私は以下の2サイトをGAEで運用していて、両サイトともGAE/Golangです。
www.tree-maps.com
www.string-utility.com
Golangなので、react・angularのSSRは捨てていました。しかし今回待望のNode.jsがリリースされたので、順次Node.jsに移行していこうと思っています。
平均0.2〜0.3秒程度遅くなるかもしれませんが、SSR可能になる事を考慮すると、その遅延は大した事ないかな?と想像しています。
いつ移行できるかまだ解りませんが、移行したら何らかの形で告知しようと思います!