1

各反復の時間を測定することで、関数のパフォーマンスを測定しようとしています。その過程で、何もしなくても結果はかなり異なることがわかりました。

例えば

volatile long count = 0;
for (int i = 0; i < N; ++i) {
    measure.begin();
    ++count;
    measure.end();
}

measure.end() では、時間差を測定し、時間カウントを追跡するために unordered_map を保持します。私は rdtsc と同様に clock_gettime を使用しましたが、常に約 1% のデータ ポイントが平均値から遠く離れており、1000 倍になっています。

上記のループが生成するものは次のとおりです。

T:  count   percentile
18  117563  11.7563%
19  111821  22.9384%
21  201605  43.0989%
22  541095  97.2084%
23  2136    97.422%
24  2783    97.7003%
...
406 1   99.9994%
3678    1   99.9995%
6662    1   99.9996%
17945   1   99.9997%
18148   1   99.9998%
18181   1   99.9999%
22800   1   100%

mean:21

したがって、ティックであろうと ns であろうと、最悪の場合の 22800 は平均よりも約 1000 倍大きくなります。

私はgrubでisolcpusを実行し、これをタスクセットで実行していました。単純なループはほとんど何もしません。時間カウントの統計を行うためのハッシュ テーブルは、時間測定の範囲外です。

私は何が欠けていますか?

ubuntu がインストールされたラップトップでこれを実行しています。CPU は Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz です。

4

1 に答える 1

1

すべての回答に感謝します。止められなかった主な割り込みは、ローカル タイマー割り込みです。そして、新しい 3.10 カーネルは tickless をサポートするようです。私はそれを試してみます。

于 2013-11-21T22:29:51.870 に答える