Як я називаю clock()
в C++
?
Наприклад, я хочу перевірити, скільки часу займає лінійний пошук, щоб знайти заданий елемент у масиві.
Як я називаю clock()
в C++
?
Наприклад, я хочу перевірити, скільки часу займає лінійний пошук, щоб знайти заданий елемент у масиві.
Відповіді:
#include <iostream>
#include <cstdio>
#include <ctime>
int main() {
std::clock_t start;
double duration;
start = std::clock();
/* Your algorithm here */
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
std::cout<<"printf: "<< duration <<'\n';
}
clock()
і clock_t
є із заголовка Стандартної бібліотеки C time.h
, і тому не потрібно використовувати std
префікси простору імен після включення їх бібліотек. <ctime>
обгортає цінність і функціонує з std
простором імен, але використовувати його не потрібно. Ознайомтесь з деталями впровадження: en.cppreference.com/w/cpp/header/ctime
Альтернативне рішення, яке є портативним та з більшою точністю, доступне з моменту C ++ 11 std::chrono
.
Ось приклад:
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;
int main()
{
auto t1 = Clock::now();
auto t2 = Clock::now();
std::cout << "Delta t2-t1: "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
<< " nanoseconds" << std::endl;
}
Запуск цього на ideone.com дав мені:
Delta t2-t1: 282 nanoseconds
using Clock=std::chrono::high_resolution_clock;
. Дивіться псевдонім типу .
std::chrono::high_resolution_clock
не є монотонним у всіх реалізаціях std lib. З cppreference - як правило, слід просто використовувати std :: chrono :: steady_clock або std :: chrono :: system_clock безпосередньо замість std :: chrono :: high_resolution_clock: використовувати steady_clock для вимірювання тривалості, а system_clock - для настінного часу.
clock()
повертає кількість годинних галочок з моменту запуску програми. Існує пов'язана константа, CLOCKS_PER_SEC
яка говорить про те, скільки кліщок годинника відбувається за одну секунду. Таким чином, ви можете перевірити будь-яку операцію на зразок цієї:
clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
timeInSeconds
завжди йде 0.000000
для мене. Як би я це виправити?
long double
щоб отримати більш точну точку.
Принаймні, у Windows єдиний практично точний механізм вимірювання - QueryPerformanceCounter (QPC). std :: chrono реалізовано з його допомогою (починаючи з VS2015, якщо ви її використовуєте), але це не точно в тій же мірі, як безпосередньо використання QueryPerformanceCounter. Зокрема, це твердження, що повідомляти про 1 наносекундну зернистість, абсолютно невірно. Отже, якщо ви вимірюєте щось, що займає дуже короткий проміжок часу (і ваш випадок може бути просто таким), тоді вам слід використовувати QPC або його еквівалент для вашої ОС. Я проти цього підходив під час вимірювання затримок кеш-пам'яті, і я записав кілька записок, які можуть вам бути корисними тут; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep() --- just a function that waits a certain amount of milliseconds
using namespace std;
int main()
{
clock_t cl; //initializing a clock type
cl = clock(); //starting time of clock
_sleep(5167); //insert code here
cl = clock() - cl; //end point of clock
_sleep(1000); //testing to see if it actually stops at the end point
cout << cl/(double)CLOCKS_PER_SEC << endl; //prints the determined ticks per second (seconds passed)
return 0;
}
//outputs "5.17"
Напевно, вас може зацікавити такий таймер: H: M: S. Msec
код в ОС Linux:
#include <iostream>
#include <unistd.h>
using namespace std;
void newline();
int main() {
int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;
//cout << "Press any key to start:";
//char start = _gtech();
for (;;)
{
newline();
if(msec == 1000)
{
++sec;
msec = 0;
}
if(sec == 60)
{
++min;
sec = 0;
}
if(min == 60)
{
++hr;
min = 0;
}
cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
++msec;
usleep(100000);
}
return 0;
}
void newline()
{
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}
usleep
не буде завжди повертатись саме після тієї суми, яку ви вимагаєте. Іноді це буде довше. Ви повинні перевірити поточний час на початку, а потім перевірити поточний час і відняти, щоб отримати абсолютний час з моменту початку кожного циклу через цикл.
Ви можете виміряти, як довго працює Ваша програма. Наступні функції допомагають вимірювати час процесора з моменту запуску програми:
моя довідка : Пакет інструментів Алгоритми тиждень 1 курс частина структур даних та спеціалізація алгоритмів Каліфорнійського університету в Сан-Дієго та Національного університету досліджень вищої школи економіки
тож ви можете додати цей рядок коду після свого алгоритму
cout << (double)clock() / CLOCKS_PER_SEC ;
Очікуваний вихід: вихід, що представляє число clock ticks per second
perf stat -d ./a.out