インライン関数は、関数呼び出しのオーバーヘッドを排除することでパフォーマンスを最適化します。コンパイラーは関数を呼び出しポイントにインライン化して、効率を向上させることができます。ベンチマークでは、インライン関数は非インライン関数よりも約 20% 高速であることが示されています。コンパイラは、インライン化するかどうかを決定するときに、関数のサイズ、複雑さ、呼び出し頻度などの要素を考慮します。
C さまざまなシナリオでのインライン関数のパフォーマンスの比較
インライン関数は、関数呼び出しを置き換えるコンパイルされたコードの一種です。関数呼び出しのオーバーヘッドを排除することで、場合によってはパフォーマンスを向上させることができます。
インライン関数の定義
C では、inline
キーワードを使用して関数をインライン関数として宣言します。
inline int sum(int a, int b) { return a + b; }
コンパイラの最適化
コンパイラは、呼び出しサイトに関数をインライン化する場合としない場合があります。コンパイラーが関数のインライン化を考慮する可能性のあるいくつかの要素を次に示します。
ベンチマーク
インライン関数のパフォーマンスを非インライン関数と比較するために、ベンチマーク テストを実行します:
#include <chrono> // 内联版本 inline int inline_sum(int a, int b) { return a + b; } // 非内联版本 int non_inline_sum(int a, int b) { return a + b; } int main() { // 运行时间变量 std::chrono::time_point<std::chrono::high_resolution_clock> start, stop; int sum1 = 0; // 内联版本 start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 10000000; i++) { sum1 += inline_sum(i, i); } stop = std::chrono::high_resolution_clock::now(); int sum2 = 0; // 非内联版本 start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 10000000; i++) { sum2 += non_inline_sum(i, i); } stop = std::chrono::high_resolution_clock::now(); std::cout << "内联版本: " << std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count() << " 微秒" << std::endl; std::cout << "非内联版本: " << std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count() << " 微秒" << std::endl; return 0; }
結果
テスト コンピューターでのベンチマーク結果は次のとおりです:
結論
ベンチマークでは、インライン関数は非インライン関数よりも約 20% 高速です。ただし、実際のパフォーマンスの向上は、特定のシナリオとコンパイラの最適化レベルによって異なることに注意してください。
以上がさまざまなシナリオでの C++ インライン関数のパフォーマンスの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。