インラインの利点を示す例。sinCos.h :
int16 sinLUT[ TWO_PI ];
static inline int16_t cos_LUT( int16_t x ) {
return sin_LUT( x + PI_OVER_TWO )
}
static inline int16_t sin_LUT( int16_t x ) {
return sinLUT[(uint16_t)x];
}
重い数の処理を行い、sin/cos の計算で無駄なサイクルを避けたい場合は、sin/cos を LUT に置き換えます。
インラインなしでコンパイルすると、コンパイラはループを最適化せず、出力 .asm に次の行に沿って何かが表示されます。
;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;* Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*
inline でコンパイルすると、コンパイラはループで何が起こっているかを把握しており、何が起こっているかを正確に把握しているため、最適化を行います。
出力 .asm には、最適化された「パイプライン化された」ループがあります (つまり、すべてのプロセッサの ALU を完全に利用しようとし、NOPS なしでプロセッサのパイプラインをフルに維持しようとします)。
この特定のケースでは、パフォーマンスを約 2 倍または 4 倍向上させることができ、リアルタイムの締め切りに必要な範囲内に収めることができました。
PS私は固定小数点プロセッサで作業していました...そしてsin/cosのような浮動小数点演算は私のパフォーマンスを殺しました.