Rust で hello-world の減量
Go でビルドサイズの比較をした流れで今度は Rust で hello-world を書いてバイナリサイズの比較をしてみます。
% rustc --version rustc 1.48.0 (7eac88abb 2020-11-16)
println!
一般的な hello-world の書き方です。
fn main() { println!("Hello, world!") }
println!
を使うために特に import は不要なんですね。
io
use std::io; use std::io::prelude::*; fn main() -> io::Result<()> { io::stdout().write(b"Hello, world!")?; Ok(()) }
Result
をハンドリングすべしとか、ちょっと面倒ですね。
参考: https://doc.rust-lang.org/std/io/index.html
syscall
syscall
的なパッケージを使ってみたかったのですが、難しくてまだできていません。
それから syscall
パッケージで使われている ams!
や llvm_asm!
がまだ stable な機能ではないらしく nightly ビルドでのみ利用可能になっています。
参考: https://blog.rust-lang.org/inside-rust/2020/06/08/new-inline-asm.html
バイナリサイズ比較
rustc
でビルドしてサイズを比べてみます。
最適化オプションについては Codegen options
を参照してください。
- 何も指定しない
-O
(opt-level=2
)を指定opt-level=z
(サイズ削減優先)を指定
を比較したところ以下のようになりました。() 内は upx -9
を適用した容量です。
default | opt-level=2 | opt-level=z | |
---|---|---|---|
println |
370K (132K) | 369K (132K) | 370K (132K) |
io |
376K (136K) | 373K (136K) | 373K (136K) |
Goの2MB程度のバイナリに比べるとかなり小さめですね。
シンプルなプログラムのためか、あまり最適化オプションによる差異はありませんでした。
println
と io
を比べると import
しているためか io
の方が容量が大きめです。