仮想関数とパフォーマンス - C++ 質問する

仮想関数とパフォーマンス - C++ 質問する

クラス設計では、抽象クラスと仮想関数を多用しています。仮想関数がパフォーマンスに影響するのではないかと感じていました。これは本当でしょうか? しかし、このパフォーマンスの違いは目立たず、早すぎる最適化を行っているように見えます。そうでしょうか?

ベストアンサー1

あなたの質問に興味をそそられたので、私たちが使用している3GHzインオーダーPowerPC CPUでいくつかのタイミングを計測してみました。私が実行したテストは、get/set関数を備えた単純な4Dベクトルクラスを作成することでした。

class TestVec 
{
    float x,y,z,w; 
public:
    float GetX() { return x; }
    float SetX(float to) { return x=to; }  // and so on for the other three 
}

次に、これらのベクトルをそれぞれ 1024 個 (L1 に収まるほど小さい) 含む 3 つの配列を設定し、それらを互いに加算するループ (Ax = Bx + Cx) を 1000 回実行しました。これを、、、として定義された関数inlinevirtual通常の関数呼び出しで実行しました。結果は次のとおりです。

  • インライン: 8ms (呼び出しあたり0.65ns)
  • 直接: 68ms (1回の呼び出しあたり5.53ns)
  • 仮想: 160ms (1回の呼び出しあたり13ns)

したがって、この場合(すべてがキャッシュに収まる場合)、仮想関数呼び出しはインライン呼び出しよりも約20倍遅くなります。しかし、これは実際には何を意味するのでしょうか。ループの各トリップは、正確に3 * 4 * 1024 = 12,288関数呼び出し(1024ベクトル×4つのコンポーネント×追加ごとに3回の呼び出し)を引き起こしたため、これらの時間は1000 * 12,288 = 12,288,000関数呼び出しを表しています。仮想ループは直接ループよりも92ミリ秒長くかかったため、呼び出しごとの追加オーバーヘッドは7でした。ナノ秒機能ごとに。

このことから私は次のように結論づけます。はい仮想関数は直接関数よりもはるかに遅く、いいえただし、1 秒間に 1000 万回呼び出す予定がない限り、問題にはなりません。

参照:生成されたアセンブリの比較。

おすすめ記事