Как засечь время выполнения программы в cи

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

Файл time.h определяет три типа: clock_t и time_t оба служат для представления времени в удобном для произведения арифметических операций виде (В этой реализации величины типа clock_t имеют наивысшую точность, воэможную для данного компьютера, а точность величин типа time_t составляет одну секунду.), тип size_t определен для представления размеров.

В time.h также определяется структура tm для стандартного представления времени по грегорианскому календарю как цепочки чисел со следующими полями: tm_sec

День недели: число дней с воскpесенья.

Число дней, пpошедших с пеpвого янваpя.

Флаг летнего вpемени: положительное значение означает, что действyет летнее вpемя, нyлевое — что оно не действyет, отpицательное — что данных об этом нет.

#include char *asctime(const struct tm *timp); #include char *_asctime_r(const struct tm *timp, void *reent);
Форматирует время в timp строку вида
Wed Jun 15 11:38:07 1988n

Строка создается в статическом буфере; каждый вызов toasctime перезаписывает строку, созданную при предыдущем вызове.

[JavaScript] Как измерить время выполнения скрипта

_asctime_r является повторно входимой версией функции asctime.

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

Возвращается yказатель на строку, содержащую отформатированное значение timestamp.

Стандарт ANSI требует наличия функции asctime.

asctime не требует никаких процедур ОС.

#include clock_t clock(void);

Вычисляет наилучшее возможное приближение общего процессорного времени, прошедшего с момента запуска программы. Для преобразования результата в секунды его нужно разделить на макро CLOCKS_PER_SEC.

Выдается общее количество процессорного времени, прошедшего с момента начала выполнения программы в единицах, определенных машинно-зависимым макро CLOCKS_PER_SEC. Если такое измерение провести нельзя, то выдается -1.

Стандарт ANSI требует наличия функции clock и макро CLOCKS_PER_SEC.

Требуется процедура ОС: times.

#include char *ctime(time_t timp);
Переводит величину в timp в местное время (как localtime) и форматирует его в строку вида
Wed Jun 15 11:38:07 1988n
(как asctime).

Возвращается yказатель на строку, содержащую отформатированное значение timestamp.

Стандарт ANSI требует наличия функции ctime.

ctime не требует никаких процедур ОС.

#include double difftime(time_t tim1, time_t tim2);
Вычитает два времени в аргументах tim1 и tim2.

Читайте также:
Программа которая проверяет делится ли на 3 введенное целое число

Выдается pазница (в секундах) между tim2 и tim1, типа double.

Стандарт ANSI требует наличия функции difftime, и определяет, что pезyльтат должен выдаваться в секyндах во всех реализациях.

difftime не требует никаких процедур ОС.

#include struct tm *gmtime(const time_t *timep

gmtime полагает, что время в timep представляет собой местное время и преобразует его в UTC (universal coordinated time — Универсальное Всемирное время, также известное как GMT, greenwich mean time), затем преобразовывает арифметическое представление в традиционное представление, определяемое struct tm.

Вычислительная сложность алгоритма

gmtime создает традиционное представление времени в статической памяти, каждый вызов gmtime или localtime переписывает это представление, созданное какой-либо из этих функций.

Возвращается указатель на традиционное представление времени (struct tm).

Стандарт ANSI требует наличия функции gmtime.

gmtime не требует никаких процедур ОС.

#include struct tm *localtime(time_t *timep);

localtime преобразовывает время в timep в местное время, затем преобразовывает арифметическое представление в традиционное представление, определяемое struct tm.

localtime создает традиционное представление времени в статической памяти, каждый вызов gmtime или localtime переписывает это представление, созданное какой-либо из этих функций.

mktime — обратная к localtime функция.

Возвращается yказатель на традиционное представление времени (struct tm).

Стандарт ANSI требует наличия функции localtime.

localtime не требует никаких процедур ОС.

#include time_t mktime(struct tm *timp);

mktime пердполагает, что время в timp — локальное, и преобразовывает его представление из традиционного представления, определенного struct tm в представление подходящее для арифметических операций.

localtime — функция, обратная к mktime.

Если содержимое структуры в timp не является правильным представлением календарного времени, то выдается -1. В противном случае выдается время преобразованное в значение time_t.

Стандарт ANSI требует наличия функции mktime.

mktime не требует никаких процедур ОС.

#include size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timp);

strftime преобразовывает представление времени типа struct tm (в timp) в строку, начиная с s и занимая не более чем maxsize знаков.

Для управления форматированием вывода используется строка в format. *format может содержать два типа спецификаций: текст для прямого копирования в форматируемую строку и спецификации преобразования времени. Спецификации преобразования времени состоят из последовательностей из двух знаков, начинающихся с % (%% включает знак процента в вывод). Каждая определенная спецификация преобразования выбирает поле в календарного времени, записанного в *timp, и преобразовывает его в строку одним из следующих способов: %a

Читайте также:
Программа для создания коллажей как в Айфоне

Сокращение для дня недели.

Полное имя для дня недели.

Сокращение для названия месяца.

Полное имя месяца.

Строка, представляющая полную дату и время в виде Mon Apr 01 13:13:13 1992

День месяца, представленный двумя цифрами.

Час (на 24-часовых часах), представленный двумя цифрами.

Час (на 12-часовых часах), представленный двумя цифрами.

Число дней в году, представленное тремя цифрами (от 001 до 366).

Номер месяца, представленный двумя цифрами.

Минута, представленная двумя цифрами.

Секунда, представленная двумя цифрами.

Номер недели, представленный двумя цифрами (от 00 до 53; первая неделя считается начавшейся в первое воскресенье года). Смотрите также %w.

День недели, представленный одной цифрой, воскресенье -нулем.

Другая версия номера недели: как %u, но считая первую неделю с первого понедельника года.

o %x Строка, полностью представляющая дату в формате Mon Apr 01 1992

Строка, представляющая полное время дня (часы, минуты и секунды) в формате 13:13:13

Последние две цифры года.

Полный год, фоpматиpованный в четыpе цифpы.

Определенно в ANSI C для выделения временного промежутка, если это возможно; в данной реализации это отсутствует (%z допускается, но по нему ничего не выводится).

Если отформатированное время занимает не более чем maxsize знаков, то выдается длина отформатированной строки. В противном случае, если форматирование было прекращено из-за нехватки места, то выдается 0 0 и строка, начинающаяся в s, соответствует тем частям *format, которые могут быть полностью представлены в пределе maxsize знаков.

Стандарт ANSI требует наличия функции strftime, но не определяет содержимое *s, если отформатированная строка занимает больше чем maxsize знаков.

strftime не требует никаких процедур ОС.

#include time_t time(time_t *t);

time находит наилучшее доступное представление текущего времени и возвращает его, закодированное как time_t. Тоже значение сохраняется в t, если только аргумент неравен NULL.

Возвращаемая -1 означает, что текущее время недоступно; в противном случае результат представляет текущее время.

Стандарт ANSI требует наличия функции time.

В некотоpых pеализациях тpебyется пpоцедypа ОС gettimeofday.

Источник: www.opennet.ru

Как засечь время выполнения программы в c

В этом посте будет обсуждаться, как найти время выполнения программы C в средах Windows и Linux.

Читайте также:
Кербал спейс программ 2 прохождение

Существует четыре широко используемых метода определения времени выполнения программы на C:

1. Использование clock() функция

Как засечь время выполнения программы в cи

Но это будет полное время выполнения программы, вместе с затратами на создание и убиение ее процесса системой.

← →
Семеныч ( 2008-03-20 19:29 ) [3]

> с точностью до 1 мсек.

создаем отдельный поточек, который запускает процессик таким образом

Type
TMyThread=Class(TThread)
Private
Procedure Execute; Override;
Public
Constructor Create;
End;

Constructor TMyThread.Create;
Begin
FreeOnTerminate:=True;
Inherited Create(False);
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create;
end;

Если недолгий одноразовый эксперимент, то ничего страшного.
Если нет, то не Real-Time, но все равно повышенный.

> > с точностью до 1 мсек.

> А вот это вряд ли получится.

GetProcessTimes

var
i,j:dword;
pi: TProcessInformation;
si: TStartupInfo;
begin
i:=GetTickCount;
FillChar(pi, sizeof(TProcessInformation), 0);
FillChar(si, sizeof(TStartupInfo), 0);
si.cb := sizeof(TStartupInfo);

CreateProcess(«D:test.exe»,
nil, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
WaitForSingleObject(PI.hProcess,INFINITE);
j:=GetTickCount;
showmessage(inttostr(j-i));
end;

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

Как раз ошибочно засекаешь время. таким образом не сравнишь реальное время работы твоего алгоритма. Учти, что во время выполнения твоего приложения происходит постоянное переключение потоков и приложений.

Для точного вычисления времени воспользуйся GetProcessTimes/GetThreadTimes. Так тебе удастся вычислить точно, сколько процессорного времени заняло выполнение твоего алгоритма.

← →
Семеныч ( 2008-03-20 20:19 ) [16]

> sashap (20.03.08 20:10) [14]

А теперь пишем правильный пример. Выбрасывая лишнее и добавляя нужное.
:o)

var
i: dword;
pi: TProcessInformation;
si: TStartupInfo;
begin
FillChar(si, sizeof(TStartupInfo), 0);
si.cb := SizeOf(TStartupInfo);
i := GetTickCount; // Здесь, а не в начале.
if CreateProcess(«D:test.exe», nil, nil, nil, false, 0, nil, nil, si, pi) then
begin
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
ShowMessage(IntToStr(GetTickCount — i));
CloseHandle(pi.hProcess);
end;
end;

← →
Семеныч ( 2008-03-20 20:22 ) [17]

> sashap (20.03.08 20:10) [14]

И если Вам действительно нужна точность, то очень советую серьезно подумать над [15]. Потому что реальное время работы одной программы (а не всей системы со всей кучей программ в ней) дает как раз GetProcessTimes.

Источник: delphimaster.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru