Member-only story
Java, Go, Rustの比較(後半)
Java、Go、Rust を比較した記事です。今回は後半です。ランタイムサイズの説明とまとめです。
Runtime size
現実世界のクラウドネイティブアプリケーションを模倣し、「私のマシンではちゃんと動作している!」というのをなくすために、3つのアプリケーションそれぞれにDockerイメージを作成しました。
Dockerファイルのソースは、それぞれのプログラムのフォルダの下にあるリポジトリに含まれています。
javaアプリケーションのベースとなるランタイムイメージとして、 openjdk:8-jre-alpine を使用しています。これは一番小さいイメージで有名ですが、いくつかの注意点があります。あなたのアプリケーションに適用される場合と適用されない場合があるという点です。主に alpine イメージは環境変数名の扱いに関して posix に準拠していないため、使えません。(dot) 文字が docker ファイルの ENV に含まれていること (大したことではありません)、もう一つは alpine Linux イメージが glibc ではなく musl libc でコンパイルされていることです。これは、アプリケーションが glibc (またはフレンド) の存在を必要とするものに依存している場合、単に動作しないということを意味します。私の場合は、alpineは問題なく動作します。
アプリケーションのGoとRust版の両方については、それらを静的にコンパイルしました。ランタイムイメージに libc (glibc, musl…など) が存在することを期待しないことを意味し、また、実行するための OS を持つベースイメージを必要としないことを意味します。そこで、私はスクラッチDockerイメージを使用しました。これは、ゼロオーバーヘッドでコンパイルされた実行ファイルをホストするno-opイメージです。
使用した docker イメージの命名規則は {lang}/webservice です。Java版、Go版、Rust版のアプリケーションのイメージサイズはそれぞれ113MB、8.68MB、4.24MBです。
Conclusion
結論を出す前に、これら3つの言語の関係性(あるいは関係性の欠如)を指摘したいと思います。JavaとGoはどちらもガベージコレクション言語ですが、JavaはJVM上で実行されるバイトコードに事前コンパイルされ…