Как использовать clock () в C ++

127

Как я могу позвонить clock()вC++ ?

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

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

Ответы:

206
#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 ::.
Чт. Thielemann
2
Это вернет ответ за секунды?
Arnav Borborah
1
@ArnavBorborah Да, это так.
QuantumHoneybees
1
@ Th.Thielemann оба clock()и clock_tвзяты из заголовка C Standard Library 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 :: stable_clock или std :: chrono :: system_clock напрямую вместо std :: chrono :: high_resolution_clock: используйте stable_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;
Shirik
источник
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

SonarJetLens
источник
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"
Garrett
источник
Это не добавляет к уже отвеченному вопросу. Сон после cl = clock () - cl не требуется. И cout печатает секунды, а не тики в секунду. cl хранит тики часов.
Dr
0

Возможно, вас заинтересует такой таймер: H: M: S. Мксек.

код в ОС 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 сек?
Dr
2
Это приведет к накоплению относительной ошибки во времени, потому что вы не включите время, необходимое для печати, и usleepне всегда вернетесь точно после суммы, которую вы просите. Иногда это будет дольше. Вы должны проверить текущее время в начале, затем проверить текущее время и вычесть, чтобы получить абсолютное время с момента начала каждого цикла.
Питер Кордес
0

вы можете измерить, как долго работает ваша программа. Следующие функции помогают измерить процессорное время с момента запуска программы:

  • C ++ (двойные) часы () / ЧАСОВ В СЕКУНДУ с включенным ctime.
  • python time.clock () возвращает значение с плавающей запятой в секундах.
  • Java System.nanoTime () возвращает длинное значение в наносекундах.

моя ссылка : набор инструментов для алгоритмов, неделя 1, часть курса по структурам данных и алгоритмам, специализация Калифорнийского университета в Сан-Диего и Национального исследовательского университета Высшей школы экономики

поэтому вы можете добавить эту строку кода после вашего алгоритма

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

Ожидаемый результат: результат, представляющий количество clock ticks per second

Мухамед Юссри
источник
1
Вопрос задается только для c ++. Так что приятно, что вы ссылаетесь на другие языки / сценарии программирования, но это не по теме.
dboy