コード内の機能ゲートの後ろにパフォーマンスに影響を及ぼす関数呼び出しをいくつか入れたいと思います。機能が有効になっていない場合、代わりにその機能の実装が空の状態になっていることを考えていました。そうすれば、欲しいことに、Rustコンパイラは機能から完全に削除することができます。このような空の関数はRustで最適化されますか?
何か:それが空の場合、fooへの呼び出しは()離れ
// Included if feature is enabled
fn foo() {
// ...
}
// Included if the feature is disabled
fn foo() {}
// Performance critical code
for i in 1..1000000000 {
// ...
foo();
}
を最適化しますか?
ループ自体がなぜ削除されないのか、私はそれを言及してくれたことに感謝しました。多分誰かがこの行動を説明することができます。 – ljedrz
このループの動作は本当に奇妙です(特に100のしきい値)。 Clangを使うと、これらのループは完全に削除されているので、LLVMはRustでも実行できると思うでしょうが、私はそれを引き起こすようには見えません:x –
@MatthieuMループは 'let mut i = 1_000_000_000;で最適化されています。一方、i> 0 {foo(); i - = 1;} ' – ArtemGr