web-dev-qa-db-ja.com

Rustではインラインをいつ使用する必要がありますか?

Rustには、これら3つのフレーバーのいずれかで使用できる「インライン」属性があります。

_#[inline]_

#[inline(always)]

#[inline(never)]

いつ使用する必要がありますか?

Rust参照では、 インライン属性セクション と言っています

コンパイラは、内部ヒューリスティックに基づいて関数を自動的にインライン化します。関数を誤ってインライン化すると、実際にプログラムが遅くなる可能性があるため、注意して使用する必要があります。

Rust internalsフォーラムでは、huonは inline の指定についても保守的でした。

しかし、標準ライブラリを含むRustソースには、 considerable usage が表示されます。多くのインライン属性が1行関数に追加されます。これにより、コンパイラーは、参照に従ってヒューリスティックを見つけて最適化することが容易になります。これらは実際には必要ありませんか?

50
WiSaGaN

現在のRustコンパイラーの1つの制限は、LTO(Link-Time Optimization)を使用していない場合、クレート全体で_#[inline]_とマークされていない関数をインライン化しないことです。 RustはLLVMのLTO実装が大規模プロジェクトにうまく対応できないため、C++に似た別個のコンパイルモデルを使用します。すばらしい状況であり、LTOとMIRインライン化の改善のいくつかの組み合わせによって将来修正される可能性があります。

#[inline(never)]は、デバッグ(期待どおりに機能しないコードを分離する)に役立つことがあります。理論的には、ベンチマークに使用できますが、それは通常悪い考えです。インライン化をオフにしても、定数伝播などの他の手続き間の最適化は妨げられません。通常のコードでは、エラー処理のみに使用される頻繁に使用されるヘルパー関数がある場合、コードサイズを削減できます。

#[inline(always)]は一般的に悪い考えです。関数が十分に大きく、コンパイラがデフォルトでインライン化しない場合、呼び出しのオーバーヘッドが問題にならないほど十分に大きい(そして、過度のインライン化は命令キャッシュのプレッシャーを増加させる)。例外もありますが、正当化するにはパフォーマンス測定が必要です。 この例 は、考慮する価値のある状況です。 #[inline(always)]は、_-O0_コード品質を改善するためにも使用できますが、通常は心配する価値はありません。

43
Eli Friedman