Эта глава посвящен функциям работы со временем (прошедшем, текущим или вычисленным) и для вычислений, использующих время.
Файл 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.
Выдается 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.
Существует четыре широко используемых метода определения времени выполнения программы на 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