クラスにメンバー関数を追加し続けると、パフォーマンスが大幅に低下しますか? クラスを使用する場合、一度にいくつかのメンバー関数しか使用できないため、理論的には、単一のクラスをメンバー関数の少ない多数の小さなクラスに分割できます。多くの関数を同じクラスに詰め込むと、パフォーマンスが大幅に低下しますか?
3 に答える
いいえ、関係ありません。
しかし、多くの公開 API が存在するということは、優れた設計をしようとしている場合は 、単一責任の原則に従っていることを確認する必要があることを示しています。
クラスを変更する理由は 1 つだけであってはなりません。
設計がそれに準拠している場合、そのすべてが適切であり、多くの機能をクラスに詰め込んでも、パフォーマンスの点で悪いことにはなりません。
一部の人々は、これらの関数のパフォーマンス ヒットについて議論するかもしれませんが、それらvirtual
の関数の目的が派生クラスでオーバーライドされるvirtual
限り、それらの関数を作成する必要がvirtual
あります。よく考えられた設計に基づいて、先に進んでそれらを作成してくださいvirtual
。パフォーマンスへの影響は、必要な機能に対して支払う代償であるため、心配する必要はありません。
また、プロファイリングのみが実際にパフォーマンスのボトルネックを正確に示すことができます。得られるのは経験に基づく憶測または推測であり、常に真の指標とはならない場合があります。
パフォーマンスへの影響は、多くの関数があることではなく、特定のタスクを実行するための関数呼び出しの深い階層があることによるものです。すべての関数呼び出しは結果として
- 現在のベースポインタを押す/保存する
- 現在のスタックポインタを保存してから、現在のスタックポインタを新しいベースポインタとして作成します。
スタック上のパラメーターをプッシュします。
関数を実行します。
たとえば、実行のシーケンスで10関数を呼び出すことになった場合、スタックを10回巻き上げ、関数(/ s)が終了したら、スタックを巻き戻す必要があります。
次に、関数へのジャンプのコストを削減するためのgcc最適化があります。たとえば、関数の局所性を改善する呼び出しを.Text
使用して、関数へのアクセスを高速化します。attribute
hot
さまざまなボトルネックを識別して最適化できるように、関数の実行を*それを実行するスレッドのコンテキストで*と考える必要があります。
クラスをより小さな断片に分割しても、バイナリ サイズに違いはありません。呼び出す関数のみにバイナリ サイズを縮小したい場合は、クラスをテンプレートにすることができます。