Измерение времени процессора в с ++
Если бы у меня был следующий код
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";
Нестандартный способ сделать это с помощью 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. Существуют также часто зависящие от платформы способы получения таймеров с высоким разрешением (очевидно, зависит от платформы).