Как я могу позвонить 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 Standard Library 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 :: stable_clock или std :: chrono :: system_clock напрямую вместо std :: chrono :: high_resolution_clock: используйте stable_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. Мксек.
код в ОС 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