Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Windows API




ANSI C

Измерение времени выполнения программы

 

При отладке программ актуальна задача оценки времени выполнения конкретного фрагмента, что позволяет понять, на сколько оптимально реализован алгоритм. Следует сразу отметить, что при измерении необходимо помнить о том, что большинство функций измерения времени имеют погрешность измерения 1 мс, а их вызов вносит определенные задержки (порядка единиц-десятков мкс). Таким образом, для повышения точности необходимо измерять интервалы, существенно больше 1 мс, например имеющие порядок секунд. Если необходимо измерить время выполнения фрагмента программы существенно меньшей величины следует организовать счетный цикл, реализующий многократное повторение одного и того же фрагмента программы.

Кроме того, следует помнить, что время однократного выполнения одного и того же фрагмента программах в разных состояниях вычислительной системы (оно может менять несколько раз в секунду) может существенно различаться.

Результат измерения при многократном повторении в цикле, приведенный к единичному выполнению, будет показывать усредненное значение времени выполнения, причем в этом случае можно добиться точности существенно выше 1 мс.

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

В соответствии со стандартом ANSI C компилятор C в библиотеке функций должен существовать файл time.h, в котором определены функции для работы со временем. Таким образом, функции, определенные в ANSI C не зависят от операционной системы и аппаратной платформы.

 

#include <time.h>

clock_t clock(void);

 

Функция clock возвращает число тактов таймера с момента запуска программы. Для преобразования результата в секунды его нужно разделить на макроопределение CLOCKS_PER_SEC. Выдается общее количество процессорного времени, прошедшего с момента начала выполнения программы в единицах, определенных машинно-зависимым макро CLOCKS_PER_SEC. Если такое измерение провести нельзя, то выдается -1. В большинстве реализаций библиотек C функция clock() имеет разрешение в 1 миллисекунду. Если тип clock_t объявлен как: typedef long clock_t;, то через 24.3 дня возвращаемые значения будут отрицательными.

 

time_t time (time_t * timer)

 

Функция time() предназначена для определения календарного времени в секундах с 1-го января 1970 года. Если значение timer не NULL, оно будет возвращено в качестве результата. Функция возвращает -1 в случае, если время определить невозможно.

 

Функции Windows целесообразно использовать в тех случаях, когда код программы не планируется переносить на другие платформы.

 

#include <windows.h>

DWORD GetTickCount();

 

Функция GetTickCount() возвращает время с момента загрузки Windows в миллисекундах. Максимальное значение - 49.7 дней, после чего счет начинается сначала. В большинстве случаев предпочтительно использование именно этой функции Windows.

 

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

 

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

 

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

 

Функция QueryPerformanceFrequency() возвращает частоту таймера высокой точности. Если возвращаемое значении 0 – таймер не существует или получить значение частоты не удалось. В документации MSDN не упоминается, что возвращаемое значение является частотой процессора, однако приближенно можно считать возвращаемую величину именно частотой процессора, а значение, возвращаемое QueryPerformanceCounter значением счетчика тактов ядра процессора (у каждого ядра свой счетчик тактов).

 




Поделиться с друзьями:


Дата добавления: 2014-11-25; Просмотров: 540; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.