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