1

2 つの関数で費やされた時間をチェックして比較しようとしています。

関数は、2 つのバックイテレータを入力として受け取ります。

これら 2 つは 1 つの関数内で呼び出されます。

void b_mark()
{
    for(int i=0;i<10;i++)
    {
         timer1.start();
         function1(std::back_inserter(itr1));
         timer1.stop();


         timer2.start();
         function2(std::back_inserter(itr2));
         timer2.stop();

    }
}

最初に呼び出す関数の方が時間がかかり、それが function1 か function2 かは問題ではないことがわかりました。

この一般的な理由は何ですか?

タイマーは のラッパーstd::clock()です。

4

2 に答える 2

1

計測している時間には の時間が含まれますstd::back_inserter(...)。初期化など、最初に呼び出すときにより多くの時間がかかる可能性がありますか?

于 2013-09-02T13:18:28.850 に答える
1

何かを測定したいときはいつでも、次のことを確認する必要があります。

  • 各測定状況は、他のすべての状況とまったく同じです。これには、同じ起動データの生成、開いているリソースを再度開く前に閉じるなどが含まれます。
  • 結果が a) 測定可能、b) 統計的に有意となるように、測定されたステップを十分な回数繰り返します。
  • 測定関数/オブジェクト自体が正しい

あなたの場合、私はそれを疑っています:

  • 各関数呼び出しを 1 回測定すると、結果が無意味になる可能性があります。システム クロックの解像度、システム リソースの割り当てのいずれかが原因で、さらに多くの理由が考えられます。
  • 最初の呼び出し中に変更される可能性のある同じコレクションで操作している可能性があります。たとえば、最初の呼び出しでは大量のメモリがコレクションに割り当てられ、2 番目の呼び出しではそれが使用されるだけです。
  • あなたのtimerクラスが間違っている可能性があり、結果が無効になる可能性があります

要するに、このテスト ケースは信頼性が低く、その結果は無効である可能性が高いようです。

次のようにコードを変更してみてください。

void b_mark()
{
    int count = 10000;
    timer1.start();
    for(int i=0;i<count;i++)
    {
        resetItr(itr1);
        function1(std::back_inserter(itr1));
    }
    timer1.stop();


    timer2.start();
    for(int i=0;i<count;i++)
    {
        resetItr(itr2);
        function2(std::back_inserter(itr2));
    }
    timer2.stop();
}
于 2013-09-02T13:23:49.280 に答える