Як використовувати годинник () в C ++


127

Як я називаю clock()в C++?

Наприклад, я хочу перевірити, скільки часу займає лінійний пошук, щоб знайти заданий елемент у масиві.


1
Зауважте, що настінний годинник не завжди є хорошим способом встановити мікро-показники. Для отримання послідовних результатів вам доведеться обійтися масштабуванням частоти процесора (включаючи Intel Turbo або аналог AMD, що дозволяє вашій частоті процесора бути вищими, коли дозволяють обмеження теплової / потужної). Профілювання за допомогою лічильників продуктивності може дати вам вимірювання в базових тактових циклах (а також детальну інформацію про те, чи є вузьке місце в кеші, не вистачає порівняно з пропускною здатністю інструкцій проти затримки, переглядаючи лічильники, окрім просто циклів). На Linux,perf stat -d ./a.out
Пітер Кордес,

Відповіді:


207
#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';
}

5
З того, що я бачу тут cplusplus.com/reference/ctime/clock , вам не потрібно використовувати позначення "std ::". Просто використовуйте "clock ()"
gromit190

4
@Birger: У всьому проекті, який я працював, ще стиль коду вимагає std :: перед кожним std :: викликом.
Чт. Тілеман

2
Це повертає відповідь за лічені секунди?
Арнав Борбора

1
@ArnavBorborah Так, це так.
QuantumHoneybees

1
@ Th.Thielemann обидва clock()і clock_tє із заголовка Стандартної бібліотеки C time.h, і тому не потрібно використовувати stdпрефікси простору імен після включення їх бібліотек. <ctime>обгортає цінність і функціонує з stdпростором імен, але використовувати його не потрібно. Ознайомтесь з деталями впровадження: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

Альтернативне рішення, яке є портативним та з більшою точністю, доступне з моменту 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

11
Якщо ви пропонуєте використовувати C ++ 11, ви можете так само добре написати using Clock=std::chrono::high_resolution_clock;. Дивіться псевдонім типу .
JHBonarius

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 - для настінного часу.
Крістіанмітк

30

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;

6
timeInSecondsзавжди йде 0.000000для мене. Як би я це виправити?
noufal

3
@noufal Можливо, витрачений час такий короткий, він відображається як 0. Ви можете спробувати скористатися a, long doubleщоб отримати більш точну точку.
Джерард

Можливо, роздільна здатність вашого годинника недостатньо висока, тому часу не минуло.
Марко Фрейденбергер

4

Принаймні, у Windows єдиний практично точний механізм вимірювання - QueryPerformanceCounter (QPC). std :: chrono реалізовано з його допомогою (починаючи з VS2015, якщо ви її використовуєте), але це не точно в тій же мірі, як безпосередньо використання QueryPerformanceCounter. Зокрема, це твердження, що повідомляти про 1 наносекундну зернистість, абсолютно невірно. Отже, якщо ви вимірюєте щось, що займає дуже короткий проміжок часу (і ваш випадок може бути просто таким), тоді вам слід використовувати QPC або його еквівалент для вашої ОС. Я проти цього підходив під час вимірювання затримок кеш-пам'яті, і я записав кілька записок, які можуть вам бути корисними тут; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#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"

Це не додає до вже відповіді на запитання. Сон після cl = clock () - cl не потрібен. І кот друкує секунди, не тикаючи за секунду. cl зберігає кліщі годинника.
Д-р Юнке

0

Напевно, вас може зацікавити такий таймер: 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";
}

Ви можете перевірити першу умову ... 10 мсек = 1 сек?
Д-р Юнк

2
Це накопичить відносну помилку в часі, оскільки ви не включаєте час, необхідний для друку, і usleepне буде завжди повертатись саме після тієї суми, яку ви вимагаєте. Іноді це буде довше. Ви повинні перевірити поточний час на початку, а потім перевірити поточний час і відняти, щоб отримати абсолютний час з моменту початку кожного циклу через цикл.
Пітер Кордес

0

Ви можете виміряти, як довго працює Ваша програма. Наступні функції допомагають вимірювати час процесора з моменту запуску програми:

  • C ++ (подвійний) годинник () / CLOCKS PER SEC з включеним ctime.
  • python time.clock () повертає значення з плаваючою комою в секундах.
  • Java System.nanoTime () повертає довге значення в наносекундах.

моя довідка : Пакет інструментів Алгоритми тиждень 1 курс частина структур даних та спеціалізація алгоритмів Каліфорнійського університету в Сан-Дієго та Національного університету досліджень вищої школи економіки

тож ви можете додати цей рядок коду після свого алгоритму

cout << (double)clock() / CLOCKS_PER_SEC ;

Очікуваний вихід: вихід, що представляє число clock ticks per second


1
Питання задається лише для c ++. Тож приємно, що ви посилаєтесь на інші мови програмування / сценарії, але це поза темою.
dboy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.