Измерение времени процессора в с ++

Если бы у меня был следующий код

clock_t t;
t = clock();
//algorithm
t = clock() - t;

t будет равно числу тактов для запуска программы. Это то же самое время процессора? Есть ли другие способы измерения времени процессора в C++?

ОС - Debian GNU/Linux Я открыт для всего, что будет работать. Я хочу сравнить процессорное время двух алгоритмов.

4 ответа

clock() указано для измерения времени процессора, однако не все реализации делают это. В частности, реализация Microsoft в VS не учитывает дополнительное время, когда запущено несколько потоков, или меньше, когда потоки программы спят / ждут.

Также обратите внимание, что clock() следует измерять время ЦП, используемое всей программой, поэтому время ЦП, используемое несколькими потоками в //algorithm будут измерены другие темы, которые не являются частью //algorithm также учитываются.

clock() это единственный метод, определенный в стандарте для измерения времени процессора, однако, существуют и другие, специфичные для платформы, методы измерения времени процессора.

std::chrono не включает часы для измерения времени процессора. Он имеет только часы, синхронизированные с системным временем, часы с постоянной скоростью относительно реального времени и часы с "высоким разрешением", которые не обязательно измеряют время ЦП.

Как измерить время процессора?

#include <ctime>

std::clock_t c_start = std::clock();
// your_algorithm
std::clock_t c_end = std::clock();

long_double time_elapsed_ms = 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC;
std::cout << "CPU time used: " << time_elapsed_ms << " ms\n";

Конечно, если вы отображаете время в секундах:

std::cout << "CPU time used: " << time_elapsed_ms / 1000.0 << " s\n";

Источник: http://en.cppreference.com/w/cpp/chrono/c/clock

Нестандартный способ сделать это с помощью pthreads:

      #include <pthread.h>
#include <time.h>

timespec cpu_time()
{
    thread_local bool initialized(false);
    thread_local clockid_t clock_id;

    if (!initialized)
    {
        pthread_getcpuclockid(pthread_self(), &clock_id);
        initialized = true;
    }

    timespec result;
    clock_gettime(clock_id, &result);
    return result;    
}

Дополнение: более стандартный способ:

      #include <sys/resource.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    struct rusage r;

    getrusage(RUSAGE_SELF, &r);

    printf("CPU usage: %d.%06d\n", r.ru_utime.tv_sec, r.ru_utime.tv_usec);
}

C++ имеет хронографическую библиотеку. См. http://en.cppreference.com/w/cpp/chrono. Существуют также часто зависящие от платформы способы получения таймеров с высоким разрешением (очевидно, зависит от платформы).

Другие вопросы по тегам