с точностью до миллисекунды в C ++? - PullRequest
7 голосов
/ 26 сентября 2010

Я не очень хочу профилировать, потому что я хотел сделать много разных небольших тестов для разных простых функций.Для себя я не могу найти способ записать количество миллисекунд в C ++, я использую Linux, кстати.

Можете ли вы предложить метод, чтобы получить системные часы в миллисекундах (я могу остановитьсясекунд, если я не могу найти легкий путь ..) и в какой заголовок они включены?

Ответы [ 2 ]

21 голосов
/ 26 сентября 2010

используя 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;
}
7 голосов
/ 26 сентября 2010

Если вы используете процессор x86, вы можете использовать инструкции ассемблера rdtsc http://en.wikipedia.org/wiki/Rdtsc, чтобы получить количество тактовых импульсов процессора между выполнением двух (или более) команд. Но: 1. Все команды rdtsc должны выполняться на одном и том же ядре ЦП (в случае, если у вас многоядерный ЦП). 2. CPU должен работать с постоянной тактовой частотой (управление питанием CPU должно быть отключено).

Дима

...