こんにちは、株式会社PentagonでエンジニアをしているYamatoです。一般的にスクリプト言語に比べてコンパイル言語のほうが早いとされています。ですので、処理速度を重視するのであればGo言語あたりが良いのではとおすすめをしたのはいいものの実際に検証をしていないなと思い、検証してみることにしました。Hello worldを表示する程度のDockerコンテナを用いて比較をします。実際コーディングするのはHello world程度でも面倒なので、以下のリポジトリをお借りしました。本来の検証では同等のものを用意するのがベストだと思います。https://github.com/qorbani/docker-golang-hello-worldhttps://github.com/brightbox/docker-rails-hello-world
本編とは関係ありませんが、apt updateを行うときに以下のエラーが発生しました。署名の検証を行う処理で問題が起きていたので--allow-unauthenticatedをつけて実行しましたが、エラーが解消しませんでした。Docker DesktopのPreferences→Resources→Disk image sizeを拡張することで解消しました。
InRelease' is not signed
検証結果
# golang
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.02ms 41.35ms 1.01s 99.51%
Req/Sec 608.99 238.44 1.18k 64.04%
71795 requests in 1.00m, 8.90MB read
Requests/sec: 1195.28
Transfer/sec: 151.74KB
# rails
Thread Stats Avg Stdev Max +/- Stdev
Latency 298.50ms 137.98ms 1.17s 76.92%
Req/Sec 14.46 7.08 40.00 83.87%
1606 requests in 1.00m, 4.78MB read
Socket errors: connect 0, read 4, write 0, timeout 0
Non-2xx or 3xx responses: 6
Requests/sec: 26.75
Transfer/sec: 81.44KB
検証ツールはwrkですbrew install wrkでインストールが可能です。(自分の環境では依存関係やupdateの関係でインストールに1時間かかりました...)2スレッド、同時接続数10、1分間負荷をかけるように指定しています。go言語の場合約7万2000でRailsは1600のリクエストでした。45倍!...ですが、処理の構成的には同等と言えるものではないのであくまで簡単なテスト結果としてこれだけの差があるということです。Railsはフレームワークなのでruby単体の処理速度というわけではありません。簡単な出力をする(API)+処理速度の観点からコンパイル言語のほうが早いという結果でした。