Функция clock в c

Функция clock в c

Доброго времени суток! Представьте, вы написали очень крутую программу, она решает поставленную задачу, алгоритм отточен до мельчайших деталей, код отрефакторен так, что сам господь улыбнется при его чтении, все отлично! Вы пришли на работу(учебу, тусовку пограмистов) и всем его показали, и тут «Васек» спросит: «А быстро работает?». И тут вы понимаете свою ошибку! Не измерили скорость работы программы! Не потестировали с разной нагрузкой, и вообще, там может быть куча дыр связанных, которые покажутся только при стрессовой нагрузке.

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

Я расскажу про C/C++ просто потому что именно на этих языках чаще всего измерял скорость работы кода, для самых разнообразных учебных задач. От сортировки пузырьком до топологической сортировки графов.

Специальный тип данных clock_t в C/C++

Это не что иное, как алиас(кличка, переименование) стандартного арифметического типа данных. В значение ставится количество процессорных тиков с момента его запуска. Получить это значение можно с помощью функции clock() из библиотеки . Для того, чтобы перевести количество тиков в секунды используется константа из той же библиотеки CLOCKS_PER_SEC . Просто делим и получаем ответ.

Распространенный совет, который дают новичкам: подключить библиотеку time.h и, с помощью функции получения времени clock() , определить время перед выполнением блока кода и после него. Время выполнения блока будет разницей полученных времен. То есть, что-то вроде

Здесь clock_t — арифметический тип для представления времени; clock() возвращает время, фиксируемое процессором от начала выполнения программы, или -1 , если оно не известно. Для выражения этого времени в секундах применяется формула clock()/CLOCKS_PER_SEC .

Читайте также:  Ситцевый натяжной потолок фото отзывы

Однако такой способ плохо подходит для измерения коротких интервалов времени. Рассмотрим следующий код

Он (взят отсюда) составлен по приведенной выше схеме и подсчитывает количество простых чисел на интервале от 0 до maxnum . Сущность вычислений сейчас не важна — они просто занимают некоторое время, которое мы пытаемся подсчитать. Выполнив, получим

Теперь уменьшим maxnum в 10 раз

Количество простых чисел сократилось даже менее, чем в 10 раз. Казалось бы, мы вправе ожидать ненулевого результата, но. Недаром пишут в руководстве по clock():

Видимо, все дело в этом "approximation".

Обращает на себя внимание то, что следующая за выводом программы строка

показывала ненулевое время. То есть системные средства считают все, что нужно, и пора ими воспользоваться.

Сначала приведем решения для Linux, хотя они работают и в Windows при использовании компилятора MinGW. Итак, альтернативами clock() являются gettimeofday() и clock_gettime() .

позволяет получить время в виде структуры timeval (вторая структура — timezone считается устаревшей и при вызове заменяется NULL’ом):

которая содержит число секунд и микросекунд, прошедших с 1-го января 1970 г. 00:00:00 Всемирного времени. Имеется в виду, что с начального момента прошло tv_sec секунд и еще tv_usec микросекунд.

Микросекунды представляются мне слишком кратким интервалом. Напишем функцию, возвращающую число миллисекунд с начального момента времени

Тестовую программу переделаем следующим образом:

В результате получим

Calculating. The number of primes lower than 100000 is: 9592 It took me 144 milliseconds.

Calculating. The number of primes lower than 10000 is: 1229 It took me 7 milliseconds.

Конечно, по хорошему, нужно было бы испытать код несколько раз и выдать среднее значение. Мы этого не делаем, поскольку нас интересует не столько конкретная цифра, сколько сама возможность подсчитать время выполнения.

Читайте также:  Экран перевод на английский

Функция clock_gettime() из time.h обеспечивает доступ к нескольким видам системных таймеров и имеет наносекундное разрешение. Прототип функции имеет вид:

clk_id позволяет выбрать вид таймера, например (приведу фрагмент из руководства, там есть и другие таймеры):

  • CLOCK_REALTIME , a system-wide realtime clock.
  • CLOCK_PROCESS_CPUTIME_ID , high-resolution timer provided by the CPU for each process.
  • CLOCK_THREAD_CPUTIME_ID , high-resolution timer provided by the CPU for each of the threads.

Время сохраняется в структуре timespec

по тому же принципу, что и в timeval : с начального момента прошло tv_sec секунд и еще tv_nsec наносекунд.

Запишем функцию, возвращающую время в миллисекундах, основываясь на clock_gettime()

Теперь — Windows-решение, работающее в Visual Studio. Это функция GetTickCount() , возвращающая время в миллисекундах с момента старта операционной системы и в течение 49.7 дней:

DWORD WINAPI GetTickCount(void);

Поскольку GetTickCount() возвращает DWORD , счетчик времени сбрасывается в ноль через 49.7 дней. Эта проблема решается использованием GetTickCount64()

ULONGLONG WINAPI GetTickCount64(void);

переполнение в которой вряд ли возможно.

Тестовая программа с использованием GetTickCount() :

Читайте также

Комментарии

Дмитрий Храмов
Компьютерное моделирование и все, что с ним связано: сбор данных, их анализ, разработка математических моделей, софт для моделирования, визуализации и оформления публикаций. Ну и за жизнь немного.

Функция clock () определена в заголовочном файле ctime . Функция clock () возвращает приблизительное время процессора, которое потребляется программой. Время clock () зависит от того, как операционная система выделяет ресурсы процессу, поэтому время clock () может быть медленнее или быстрее, чем фактические часы.

Синтаксис:

Параметры: эта функция не принимает никаких параметров.

Возвращаемое значение: эта функция возвращает приблизительное время процессора, затраченное программой, а при сбое функция возвращает -1.

Ниже программа иллюстрирует реализацию функции clock ():

Читайте также:  Сетевая ошибка обнаружен конфликт ip адресов windows

// C ++ программа для демонстрации
// пример функции clock ().

using namespace std;

// без использования функции pow

time_req = clock ()- time_req;

cout "Processor time taken for multiplication: "

float )time_req/CLOCKS_PER_SEC " seconds"

// Использование функции pow

a = log ( pow (i, 4));

time_req = clock () — time_req;

cout "Processor time taken in pow function: "

Ссылка на основную публикацию
Установить gvlk ключ что это
В связи с недавним выходом окончательной RTM версии пакета Microsoft Office 2016, корпоративные заказчики уже могут начинать переход на новую...
Топ вай фай адаптеров для пк
На заре развития интернета люди пользовались только проводным трафиком. После этого в «моду» начали входить модемы, которые подключались к беспроводному...
Топ дешевых наушников с хорошим звуком
Проводные наушники должны умереть! Так решил мобильный рынок и производители смартфонов, стремительно избавляющиеся от устаревшего 3,5 мм джека. Стоит ли...
Установить openal32 dll для windows 7
Данная библиотека задействуется во многих процессах во время работы компьютера. Например, она используется в играх, мультимедиа и различных программах. Иногда...
Adblock detector