0

後でコードを最適化するのではなく、最初から良いコードを書くことに興味があります。ベンチマークを提供できなくて申し訳ありませんが、現時点では動作するシナリオがありません。ご清聴ありがとうございました!

FunctionX よりも FunctionY を使用すると、どのようなパフォーマンスが向上しますか?

これについてはすでにstackoverflowで多くの議論がありますが、以下に示すようにサブメンバー(再帰的)にアクセスする場合は疑問です。コンパイラ (VS2008 など) は FunctionX を FunctionY のようなものに最適化しますか?

void FunctionX(Obj * pObj)
{
   pObj->MemberQ->MemberW->MemberA.function1();
   pObj->MemberQ->MemberW->MemberA.function2();
   pObj->MemberQ->MemberW->MemberB.function1();
   pObj->MemberQ->MemberW->MemberB.function2();
   ..
   pObj->MemberQ->MemberW->MemberZ.function1();
   pObj->MemberQ->MemberW->MemberZ.function2();
}

void FunctionY(Obj * pObj)
{
   W * localPtr = pObj->MemberQ->MemberW;
   localPtr->MemberA.function1();
   localPtr->MemberA.function2();
   localPtr->MemberB.function1();
   localPtr->MemberB.function2();
   ...
   localPtr->MemberZ.function1();
   localPtr->MemberZ.function2();
}
4

3 に答える 3

2

どのメンバーポインターも volatile または volatile へのポインターでなくoperator ->、チェーン内のどのメンバーに対してもオーバーロードされていない場合、両方の関数は同じです。あなたが提案した最適化ルールは、Common Expression Elimination として広く知られており、何十年にもわたって大多数のコンパイラでサポートされています。

于 2012-09-13T23:13:21.400 に答える
1

理論的には、余分なポインター逆参照を節約できますが、現実の世界では、コンパイラーがおそらくそれを最適化するため、無駄な最適化です。

これが、最初にプロファイリングしてから後で最適化することが重要な理由です。コンパイラはあなたを助けるためにできる限りのことをしています。すでに行っていることをしているだけではないことを確認することもできます。

于 2012-09-13T23:14:08.170 に答える
0

コンパイラが十分に優れていれば、functionX を functionY に似たものに変換する必要があります。ただし、異なるコンパイラと異なる最適化フラグを持つ同じコンパイラで異なる結果が得られる可能性があります。「ダム」コンパイラ機能を使用する方が高速である必要があり、IMHOの方が読みやすく、コーディングが高速です。だからfunctionYに固執する

ps。コード スタイル ガイドを参照する必要があります。通常、メンバー名と関数名は常に小文字で開始する必要があります。

于 2012-09-13T23:14:50.213 に答える