dynamic-lib
と static-lib
という別方式で作られた 2 つのクレートの呼び出し方の違いを比べるためのアプリケーション。
デフォルトでは「ログ出力なし」だが、方式ごとに決められた方法を使うと「ログ出力あり」に変更できる。
dynamic-lib
クレート がトレイトオブジェクトを使う方式で作られたやつ。
- トレイトオブジェクトを使っているので動的ディスパッチになってしまい、パフォーマンス的には不利
- バイナリサイズ的には小さくなるかも(使い方によっては小さくならない)
- どの実装を使うのかランタイムに決定できる
- ランタイムに決定できるので、環境変数などによって実装を使い分けることが可能
# ログ出力なし
cargo run
# ログ出力あり
ENV=DEVELOPMENT cargo run
static-lib
クレート はトレイト境界を使う方式で作られたやつ。
- トレイト境界をつけた型変数を使っているので静的ディスパッチになり、パフォーマンス的には有利
- 静的にいろんな型を渡している場合バイナリサイズが大きくなる
- しかし呼び出しの経路全部に型変数がつくので結構邪魔に思う人はいるかも
impl Trait
を使えば型変数がつくのを抑えられる
- どの実装を使うのかコンパイルタイムに決定される
- コンパイルタイムに決定しなければならないので feature フラグと
cfg
の組み合わせなどで使い分けることが可能- profile を取得できればフラグ付けなくても良くなるんだけどやり方がわからない(できるのか?)
# ログ出力なし
cargo run
# ログ出力あり
cargo run --features log