1

私の質問は、 C++ でデバッグ情報を使用する場合と使用しない場合の関数の適切な設計方法から来ています。次の関数の効率を比較したい:

機能 1

bool my_func1(int arg1, int &output, std::vector<int> &intermediate_vec);
  {
     // do something
  }

この関数を使用するときは、次の方法で呼び出します。

int arg;
int output;
std::vector<int> intermediate_vec;
my_func1(arg,output,intermediate_vec);

機能 2

  bool my_func2(int arg1, int &output);
  {

    std::vector<int> intermediate_vec
    return my_func1(arg1, output, intermediate_vec);
  }

この関数を使用するときは、次の方法で呼び出します。

int arg;
int output;
my_func2(arg,output);

私の質問は、これら 2 つの機能の効率は同じですか?

4

6 に答える 6

1

質問は本当にばかげています。それはあなたが作る使い方に本当に依存しますintermediate_vec。インターフェイスの一部である場合は、それを引数にして、事前条件と事後条件を文書化する必要があります。インターフェイスの一部でない場合、それを引数にすると、公開されるべきではない関数の内部が公開されます。効率(プログラマーの効率を除く)はそこに入りません。

それを超えて、効率を比較する唯一の方法は (少なくともこの種のケースでは) 測定することです。

最後に、タイトで頻繁に実行されるループで関数を呼び出していて、 intermediate_vec(バージョン 2 での) の構築が大幅な遅延を引き起こしていることをプロファイラーが示している場合は、最初のバージョンを使用して、実際のベクターをループ; ベクトルはおそらくすぐに最大容量に達し、その後は動的割り当ては行われなくなります。しかし、この種の変更は、絶対に必要な場合、つまりプログラムの速度が十分でない場合にのみ行うべきものであり、プロファイラーは、ベクトルを作成する際の割り当てがその重要な理由であることを示しています。そして、私はあなたがそうかもしれないことを強調します。多くは、コンパイラがどのように最適化するか、およびどのようstd::vectorに実装されるかに依存します。

于 2013-06-21T08:05:51.057 に答える
1

関数のシグネチャだけでは、関数のパフォーマンスについてほとんど何もわかりません。これらの署名のいずれかを使用して、想像できる最速の関数と最も遅い関数を作成できます。

2 番目のオプションでは、3 番目のパラメーターを関数に追加します。そのパラメータが必要ですか?必要な場合は、そのオプションを使用してください。そうでない場合は、最初のものを使用してください。

于 2013-06-21T07:56:26.527 に答える
0

最適化された関数の動作は、多くの場合非常に予測不可能です。結局、関数はインライン化され、まったく同じパフォーマンス特性を示す場合があります。いずれの場合もインライン化されていないか、一部の最適化が失敗する可能性があり、いずれの場合もパフォーマンスが低下する可能性があります。そのようなことを真剣に把握する唯一の方法は、さまざまな設定で信頼できるプロファイラーを使用してパフォーマンスを測定することです。

于 2013-06-21T08:03:04.747 に答える
0

現実的な測定のために CPU クロック時間を測定する

于 2013-06-21T07:58:34.757 に答える