2

私のプロジェクトでは、次のような抽象化レイヤーがいくつかあります。

 Vector3 normalizeVector(Vector3 v);

 Vector3 vectorMultiplyMatrix(Vector3 v, Matrix3 m);

これは、DirectXMath のようなプラットフォーム固有の数学ライブラリへの単純な「プロキシ」関数です。

私の質問は、これらのレイヤーのコストを削減するにはどうすればよいですか? これらすべての関数をインライン化することで、プラットフォーム固有の関数を直接呼び出す代わりにそれらを呼び出すコストが完全になくなりますか?

ありがとう

4

2 に答える 2

4

一連の関数呼び出しを別の関数呼び出しにまとめるという意味で、新しい抽象化レベル (プロキシ、ファサードなど) を追加するコストはごくわずかです。特に複雑なオブジェクトやコンテナーなどを使用している場合は、データを渡す方法によって問題が発生する可能性があります。

Vector3 normalizeVector(Vector3 v);

Vector3呼び出しごとに渡されたオブジェクトのコピーを作成します。パフォーマンスの問題が発生した場合は、値渡しをconst参照渡しに変更して、コピーが作成されないようにします。

Vector3 normalizeVector(const Vector3& v);

この関数のこの新しいプロトタイプは、 「使用するが変更しない既存の有効なオブジェクトへの参照が必要です」をVector3表しています。

本当にパフォーマンスの問題に直面しない限り、コードを最適化しないでください。時期尚早の最適化は常に悪であり、常にそうなるでしょう。

于 2013-03-02T12:01:55.243 に答える
1

関数の本体を公開すると、インライン化によって関数呼び出しを排除する機会がコンパイラに与えられます。

実際にそれがかかるかどうかは、その内部ヒューリスティックに依存します。インライン化により、生成されたコードの全体的なサイズが拡大し、キャッシュに優しくなくなり、最終的には呼び出しを排除する利点が無効になります。

コンパイラの費用対効果の分析をオーバーライドするために使用できる特別なキーワード ( VC++ の__forceinlineなど) がありますが、これらの種類の決定については、プログラマよりもコンパイラの方が正しいことがよくあります。

プロファイルに基づく最適化を使用すると、プログラムの実際の使用パターンに基づいて、コンパイラがより適切な最適化の決定を下すのに役立ちます。これには、どの関数がインライン化するのに十分「ホット」であり、どの関数が「コールド」であり、そのままにしておく必要があるかが含まれます。


覚えておくべき特に強力な手法の 1 つは、テンプレート メタプログラミングです。アイデアは、可能な限り多くの計算をコンパイル時にプッシュすることです。

于 2013-03-02T12:25:01.760 に答える