1
 timespec start, end;
 clock_gettime(CLOCK_MONOTONIC, &start);
 ---code--lookup in a unordered map <string, int>
 clock_gettime(CLOCK_MONOTONIC, &end);
 int diff = diff_ns(end, start);

Results:
 SAMPLE   MIN(ns)   MAX(ns)   AVG(ns)
           100      1000      3000      1430
           500      1000      2000      1436
          1000         0     16000      1441
          5000         0     15000      1479
         10000         0     26000      1489
         50000         0    363000      1589
        100000         0    110000      1591
        200000         0    804000      1659
        300000         0    118000      1668
        400000      1000    354000      1701
        500000         0   8679000      1712
        600000         0    809000      1701
        700000         0    373000      1704
        800000         0    850000      1716
        900000         0    856000      1736
       1000000         0    817000      1730
  • CPU が clock_gettime の計算に費やした時間を無視するにはどうすればよいですか?

  • シングルスレッドプログラムでテストを実行しています...しかし、他のプロセスもVMで実行されている可能性があるため、コンテキストスイッチが発生していないことを確認する方法

  • ナノ秒単位で測定しているため、時間がゼロになることがありますが、奇妙なことに、何かがゼロナノ秒で実行されるのはなぜでしょうか?

4

1 に答える 1

4

シングルスレッドプログラムでテストを実行しています...しかし、他のプロセスもVMで実行されている可能性があるため、コンテキストスイッチが発生していないことを確認する方法

必要のないすべてのプロセスを強制終了し、オプションがある場合は、プロファイルされたプロセスの優先度を上げます。

それ以外では、profまたはcallgrindを使用してプログラムのプロファイリングを行うことができます。

ナノ秒単位で測定しているため、時間がゼロになることがありますが、奇妙なことに、何かがゼロナノ秒で実行されるのはなぜでしょうか?

CPU クロックの精度が 10 ミリ秒を超えているため、実行時間は 0 ナノ秒です。

より多くの反復後に時間を測定すると、より良い結果が得られます。


さらにルックアップを行い、値を平均化します。

 timespec start, end;
 clock_gettime(CLOCK_MONOTONIC, &start);
 for (int i=0;i<10000;++i)
 ---code--lookup in a unordered map <string, int>
 clock_gettime(CLOCK_MONOTONIC, &end);
 int diff = diff_ns(end, start)/10000;

このように、clock_gettime で費やされた時間は無視されます。

于 2013-10-25T17:42:51.363 に答える