7

さまざまな単純な関数でさまざまな小さなベンチマークを実行したかったので、プロファイルを作成したくありません。私の人生では、C ++でミリ秒数を記録する方法を見つけることができません。ちなみにLinuxを使用しています。

システムクロックをミリ秒単位で取得する方法を提案できますか (簡単な方法が見つからない場合は、秒単位で解決できます..)、それらが含まれるヘッダーは何ですか?

4

2 に答える 2

20

ヘッダーファイルのgettimeofday関数を使用して、このクラスを使用します:sys/time.h

#include <cstdlib>
#include <sys/time.h>

class Timer
{
    timeval timer[2];

  public:

    timeval start()
    {
        gettimeofday(&this->timer[0], NULL);
        return this->timer[0];
    }

    timeval stop()
    {
        gettimeofday(&this->timer[1], NULL);
        return this->timer[1];
    }

    int duration() const
    {
        int secs(this->timer[1].tv_sec - this->timer[0].tv_sec);
        int usecs(this->timer[1].tv_usec - this->timer[0].tv_usec);

        if(usecs < 0)
        {
            --secs;
            usecs += 1000000;
        }

        return static_cast<int>(secs * 1000 + usecs / 1000.0 + 0.5);
    }
};

例えば:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    Timer tm;
    std::ostringstream ooo;
    std::string str;

    tm.start();
    for(int i = 0; i < 10000000; ++i)
    {
        ooo << "This is a string. ";
    }
    tm.stop();
    std::cout << "std::ostingstream -> " << tm.duration() << std::endl;

    tm.start();
    for(int i = 0; i < 10000000; ++i)
    {
        str += "This is a string. ";
    }
    tm.stop();
    std::cout << "std::string -> " << tm.duration() << std::endl;
}
于 2010-09-26T12:12:43.460 に答える
7

x86 CPUを使用している場合は、rdtscアセンブラー命令http://en.wikipedia.org/wiki/Rdtscを使用して、2つ(またはそれ以上)のコマンドの実行間のCPUクロック数を取得できます。ただし、次のようになります。1.すべてのrdtscコマンドは同じCPUコアで実行する必要があります(マルチコアCPUを使用している場合)。2. CPUは一定のクロック周波数で動作する必要があります(CPU電源管理を無効にする必要があります)。

ディマ

于 2010-09-26T12:30:07.473 に答える