Как вывести время работы программы в си

аргумент – указатель, которому будет присвоено значение. При нулевом указателе NULLзначение не присваивается.

Функция определения разницы во времени между двумя событиями.

Функция difftimeВычисляет разницу во времени между двумя событиями.

double difftime(time_t time2, time_t time1);

Прототип в time.h

Примечания Вычисляет время в секундах, прошедшее от time1 до time2.

Значение Типа double.

Переносимость Эта функция доступна в системах UNIX и опреде-

См. также asctime, ctime, daylight(глобальная переменная), gmtime,localtime,time,timezone(глобальная переменная)

first=time(NULL); /* системное время */

delay(2000); /* ожидает 2 секунды */

Функция перевода даты и времени в значение по Гринвичу.

Функция gmtime переводит дату и время в значение по Гринвичу (GMT).

struct tm *gmtime(const time_t *timer);

Прототип в time.h

Примечания gmtime принимает адрес значения, полученного с помощью функции time, и возвращает указатель на структуру tm, содержащую разнесенное по отдельным полям значение времени, переведенное непосредственно в GMT.

Получение времени и даты в C/C++ Windows

Глобальная переменная timezone должна содержать разность в секундах между временем по Гринвичу (GMT) и местным поясным временем (для Тихоокеанского Стандартного времени, PST, timezone = 8 * 60 * 60).

Глобальная переменная daylight должна иметь ненулевое значение ТОЛЬКО В ТОМ СЛУЧАЕ, если должен применяться американский стандарт летнего времени.

Структура tm определена в time.h следующим образом:

Эти величины дают: время в 24-часовом исчислении, день месяца от 1 до 31, месяц от 0 до 11, день недели (воскресенью соответствует 0), (год — 1900), день года от 0 до 365 и флаг, который не равен 0, если действует летнее время.

Значение gmtime возвращает указатель на структуру tm, содержащую разнесенное по отдельным полям значение времени. Эта структура — статический объект, поэтому она перезаписывается при каждом вызове.

Переносимость Эта функция доступна в системах UNIX и определена в ANSI C.

См. также asctime, ctime, ftime, localtime, stime, time, tzset

/* Тихоокеанское Стандартное время с режимом летнего времени */

char *tzstr = «TZ=PST8PDT»;

struct tm *gmt, *area;

printf(«Local time is: %s», asctime(area));

printf(«GMT is: %s», asctime(gmt));

Функция установки даты и времени создания / модификации файла.

Функция setftimeУстанавливает дату и время создания / модификации файла.

int setftime(int handle, struct ftime *ftimep);

Примечания setftime устанавливает дату и время создания / модификации файла, связанного с handle, в значения, содержащиеся в структуре ftime, на которую указывает ftimep.

Структура ftime определена следующим образом:

unsigned ft_tsec: 5; /* пары секунд */

unsigned ft_min: 6; /* минуты */

unsigned ft_hour: 5; /* часы */

unsigned ft_day: 5; /* дни */

Язык Си для начинающих / #9 — Работа с файлами

unsigned ft_month: 4; /* месяцы */

unsignedft_year: 7; /* год — 1980 */

Значение setftime возвращает 0 в случае успешного завершения. В случае ошибки возвращается -1 и глобальная переменная errno устанавливается в одно из следующих значений:

EINVFNC Неверный номер функции

EBADF Неверный номер файла

Переносимость Эта функция доступна только в DOS.

См. также gettime

struct ftime filet; FILE *fp;

if ((fp = fopen(«TEST.$$$», «w»)) == NULL)

fprintf(fp, «testing. n»);

/* загрузить в структуру ftime новое время и дату */

/* показать время и дату в текущем справочнике */

/* изменить время и дату */

/* закрыть и удалить временный файл */

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

Время и работа с ним

Базовым средством для работы с часами процессорного времени является функция clock() (см. листинг 12.15). Она возвращает в качестве результата процессорное время, затраченное процессом с некоего момента, зависящего от реализации и связанного только с его (процесса) запуском. В случае ошибки результат равен ( clock_t ) (-1).

#include clock_t clock (void);
Листинг 12.15. Описание функции clock().

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

Отметим, что если значения типа clock_t представлены как 32-разрядные целые со знаком, то менее чем через 36 минут ( процессорного времени ) наступит переполнение .

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

#include #include int main (void) < time_t st; clock_t ct; double s = 0; double d = 1; int i; fprintf (stderr, «Начало выполнения циклаn»); (void) time ( ct = clock; for (i = 1; i fprintf (stderr, «Процессорное время выполнения цикла: %g сек.n», (double) (clock — ct) / CLOCKS_PER_SEC); fprintf (stderr, «Астрономическое время выполнения цикла: %g сек.n», difftime (time (NULL), st)); return (0); >

Читайте также:
Установить программу на телевизор Самсунг с флешки

Листинг 12.16. Пример программы, использующей функции опроса показаний часов реального и процессорного времени.

Возможные результаты работы этой программы показаны в листинге 12.17. Процессорное время получилось больше астрономического из-за ошибок округления.

Начало выполнения цикла Процессорное время выполнения цикла: 15.19 сек. Астрономическое время выполнения цикла: 15 сек.

Листинг 12.17. Возможные результаты работы программы, использующей функции опроса показаний часов реального и процессорного времени.

Для измерения времени выполнения простой команды можно воспользоваться служебной программой time (не входящей, правда, в обязательную часть стандарта POSIX-2001 ):

time [-p] команда [аргумент . ]

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

time -p my_tcex

выдаст в стандартный протокол примерно следующее (см. листинг 12.18):

Начало выполнения цикла Процессорное время выполнения цикла: 15.2 сек. Астрономическое время выполнения цикла: 15 сек. real 15.20 user 15.20 sys 0.00

Листинг 12.18. Возможные результаты измерения времени работы программы, использующей функции опроса показаний часов реального и процессорного времени.

Если нужно измерить время выполнения конвейера или списка команд, их можно поместить в файл , превратив тем самым в простую команду, или воспользоваться конструкцией вида

time sh -c ‘составная команда’

Оружием более крупного калибра является специальная встроенная в shell команда

times

Она выдает на стандартный вывод процессорное время , затраченное командным интерпретатором и порожденными им процессами. Например, после выполнения команд

my_tcex время системных услуг в обоих случаях оказалось пренебрежимо малым.

Реализация описанных выше утилит time и times опирается на функцию times() (см. листинг 12.19). Она опрашивает данные о времени выполнения вызывающего процесса и порожденных процессов, завершение которых ожидалось с помощью функций wait() или waitpid() . В отличие от clock() , функция times() измеряет время в тактах часов , и переполнение 32-разрядного представления значений типа clock_t происходит не через полчаса, а примерно в течение года (если секунда делится на 60 — 100 тактов). Соответственно, для перевода результатов работы times() в секунды их нужно делить на sysconf ( _SC_CLK_TCK ), а не на CLOCKS_PER_SEC .

#include clock_t times (struct tms *buffer);
Листинг 12.19. Описание функции times().

В качестве результата функция times() возвращает астрономическое время , прошедшее от некоторого момента в прошлом (например, от загрузки системы), но основные, содержательные данные, относящиеся к вызывающему процессу и его потомкам, помещаются в структуру типа tms , которая описана в заголовочном файле и, согласно стандарту POSIX-2001, должна содержать по крайней мере следующие поля:

clock_t tms_utime; /* Процессорное время, затраченное */ /* вызывающим процессом */ clock_t tms_stime; /* Процессорное время, затраченное системой */ /* на обслуживание вызывающего процесса */ clock_t tms_cutime; /* Процессорное время, затраченное /*завершившимися порожденными процессами */ clock_t tms_cstime; /* Процессорное время, затраченное системой */ /* на обслуживание завершившихся */ /* порожденных процессов */

Значения времени завершившихся порожденных процессов ( tms_utime и tms_cutime , а также tms_stime и tms_cstime ) добавляются, соответственно, к элементам tms_cutime и tms_cstime структуры родительского процесса при возврате из функций wait() или waitpid() . Это происходит рекурсивно: если порожденный процесс ожидал завершения своих потомков, то в упомянутых элементах структуры накопятся данные о времени выполнения поддерева процессов.

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

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Программа копирует строки со стандартного ввода на стандартный вывод, */ /* «прокачивая» их через пару сокетов. */ /* Используются функции ввода/вывода нижнего уровня. */ /* Измеряется астрономическое и процессорное время */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include #include #include #include #define MY_PROMPT «Вводите строкиn» #define MY_MSG «Вы ввели: » int main (void) < int sds [2]; char buf [1]; int new_line = 1; /* Признак того, что надо выдать сообщение MY_MSG */ /* перед отображением очередной строки */ clock_t st_ct; /* Данные об астрономическом и процессорном времени */ struct tms st_cpt; /* в начале работы программы */ clock_t en_ct; /* Данные об астрономическом и процессорном времени */ struct tms en_cpt; /* в конце работы программы */ long tck_p_sec; /* Количество тактов часов в секунде */ /* Опросим данные о времени начала выполнения */ if ((st_ct = times ( perror («TIMES-1»); return (1); >/* Создадим пару соединенных безымянных сокетов */ if (socketpair (AF_UNIX, SOCK_STREAM, 0, sds) < 0) < perror («SOCKETPAIR»); return (2); >switch (fork ()) < case -1: perror («FORK»); return (3); case 0: /* Чтение из сокета sds [0] и выдачу на стандартный вывод */ /* реализуем в порожденном процессе */ while (read (sds [0], buf, 1) == 1) < if (write (STDOUT_FILENO, buf, 1) != 1) < perror («WRITE TO STDOUT»); break; >> exit (0); > /* Чтение со стандартного ввода и запись в сокет sds [1] */ /* возложим на родительский процесс */ if (write (sds [1], MY_PROMPT, sizeof (MY_PROMPT) — 1) != sizeof (MY_PROMPT) — 1) < perror («WRITE TO SOCKET-1»); >while (read (STDIN_FILENO, buf, 1) == 1) < /* Перед отображением очередной строки */ /* нужно выдать сообщение MY_MSG */ if (new_line) < if (write (sds [1], MY_MSG, sizeof (MY_MSG) — 1) != sizeof (MY_MSG) — 1) < perror («WRITE TO SOCKET-2»); break; >> if (write (sds [1], buf, 1) != 1) < perror («WRITE TO SOCKET-3»); break; >new_line = (buf [0] == ‘n’); > shutdown (sds [1], SHUT_WR); (void) wait (NULL); /* Опросим данные о времени конца выполнения, */ /* вычислим и выдадим результаты измерений */ if ((en_ct = times ( perror («TIMES-2»); return (4); >tck_p_sec = sysconf (_SC_CLK_TCK); fprintf (stderr, «Тактов в секунде: %ldn», tck_p_sec); fprintf (stderr, «Астрономическое время работы программы: %g сек.n», (double) (en_ct — st_ct) / tck_p_sec); fprintf (stderr, «Процессорное время, затраченное процессом: %g сек.n», (double) (en_cpt.tms_utime — st_cpt.tms_utime) / tck_p_sec); fprintf (stderr, «Процессорное время, затраченное системой: %g сек.n», (double) (en_cpt.tms_stime — st_cpt.tms_stime) / tck_p_sec); fprintf (stderr, «Аналогичные данные для порожденных процессов:n»); fprintf (stderr, «%g сек.n%g сек.n», (double) (en_cpt.tms_cutime — st_cpt.tms_cutime) / tck_p_sec, (double) (en_cpt.tms_cstime — st_cpt.tms_cstime) / tck_p_sec); return (0); >
Листинг 12.20. Пример программы, использующей функцию times().

Читайте также:
Как пользоваться программой r studio на русском языке

Если перенаправить стандартный ввод в какой-либо текстовый файл заметных размеров, а стандартный вывод — в другой файл , можно получить результаты, подобные тем, что показаны в листинге 12.21.

Тактов в секунде: 100 Астрономическое время работы программы: 1.19 сек. Процессорное время, затраченное процессом: 0.02 сек. Процессорное время, затраченное системой: 0.08 сек. Аналогичные данные для порожденных процессов: 0.09 сек. 1 сек.
Листинг 12.21.

Возможные результаты работы программы, использующей функцию times().

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

#include int clock_getcpuclockid (pid_t pid, clockid_t *clock_id);
Листинг 12.22. Описание функции clock_getcpuclockid().

Идентификатор часов процессорного времени , обслуживающих заданный аргументом pid процесс, возвращается по адресу, специфицированному аргументом clock_id . Если значение pid равно нулю, имеется в виду вызывающий процесс. Признаком успешного завершения является нулевой результат; в противном случае возвращается код ошибки .

В листинге 12.23 показан пример употребления функции clock_getcpuclockid() и манипулирования часами процессорного времени . Возможные результаты выполнения этой программы — в листинге 12.24.

#include #include #include #include int main (void) < clockid_t clk_id; /* Идентификатор часов процессорного времени */ struct timespec tmsp; double s = 0; double d = 1; int i; if ((errno = clock_getcpuclockid ((pid_t) 0, perror («CLOCK_GETCPUCLOCKID»); return (1); >if (clock_getres (clk_id, perror («CLOCK_GETRES»); return (2); >printf («Разрешающая способность часов процессорного времени: %ld нсек.n», tmsp.tv_nsec); /* Измерим процессорное время выполнения цикла. */ fprintf (stderr, «Начало выполнения циклаn»); tmsp.tv_sec = tmsp.tv_nsec = 0; if (clock_settime (clk_id, perror («CLOCK_SETTIME»); return (3); >for (i = 1; i if (clock_gettime (clk_id, perror («CLOCK_GETTIME»); return (4); >fprintf (stderr, «Процессорное время выполнения цикла: %ld сек. %ld нсек.n», tmsp.tv_sec, tmsp.tv_nsec); return (0); >
Листинг 12.23.

Пример программы, манипулирующей часами процессорного времени.
Разрешающая способность часов процессорного времени: 2 нсек. Начало выполнения цикла Процессорное время выполнения цикла: 15 сек. 350313054 нсек.
Листинг 12.24.

Возможные результаты работы программы, манипулирующей часами процессорного времени.

Читайте также:
Программа которая делает пригласительные

Обратим внимание на два момента. Перед началом измеряемого участка программы на часах процессорного времени были установлены нулевые показания, что, разумеется, не влияет на приоритет процесса и его планирование. Конечно, можно было обойтись без переустановки, запомнив показания часов в начале и конце измеряемого промежутка и произведя затем их вычитание , но технически это чуть сложнее; кроме того, нам хотелось применить функцию clock_settime() . Второй заслуживающий отдельного упоминания момент состоит в отсутствии необходимости выяснять идентификатор часов процессорного времени вызывающего процесса с помощью функции clock_getcpuclockid() : можно воспользоваться именованной константой CLOCK_PROCESS_CPUTIME_ID .

Источник: intuit.ru

ИнтеллигенцияX

Янв 19, 2014 — Уроки C#, Уроки Visual Basic.NET Написать комментарий

Время выполнения кода?

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

Сегодня разберем два примера.

rst.rst04164 Время выполнения кода?

Класс StopWatch унаследованный от System.Diagnostics

Imports System.Diagnostics Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim SW As New Stopwatch ‘Создаем объект SW.Start() ‘Запускаем System.Threading.Thread.Sleep(1000) ‘Наш код SW.Stop() ‘Останавливаем MsgBox(SW.ElapsedMilliseconds) ‘Время выполнения в миллисекундах MsgBox(SW.Elapsed.Seconds) ‘Время выполнения в секундах MsgBox(SW.ElapsedTicks) ‘Тики End Sub End Class
using System.Diagnostics; namespace WindowsFormsApplication1 < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Stopwatch SW = new Stopwatch(); // Создаем объект SW.Start(); // Запускаем System.Threading.Thread.Sleep(1000); // Наш код SW.Stop(); //Останавливаем MessageBox.Show(Convert.ToString(SW.ElapsedMilliseconds)); // Время выполнения в миллисекундах MessageBox.Show(Convert.ToString(SW.Elapsed.Seconds)); // Время в секундах MessageBox.Show(Convert.ToString(SW.ElapsedTicks)); // Время в тиках >> >

Очень простой вариант с помощью двух классов DateTime и TimeSpan

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim Start As Date ‘Время запуска Dim Stoped As Date ‘Время окончания Dim Elapsed As New TimeSpan ‘Разница Start = Now ‘Старт (Записываем время) System.Threading.Thread.Sleep(1000) ‘Наш код Stoped = Now ‘Стоп (Записываем время) Elapsed = Stoped.Subtract(Start) ‘Вычитаем из Stoped (когда код выполнился) время Start (когда код запустили на выполнение) MsgBox(Elapsed.TotalMilliseconds) ‘Время выполнения в миллисекундах с плавующей запятой MsgBox(Elapsed.Seconds) ‘Время выполнения в секундах End Sub
private void button2_Click(object sender, EventArgs e) < DateTime Start; // Время запуска DateTime Stoped; //Время окончания TimeSpan Elapsed = new TimeSpan(); // Разница Start = DateTime.Now; // Старт (Записываем время) System.Threading.Thread.Sleep(1000); // Наш код Stoped = DateTime.Now; // Стоп (Записываем время) Elapsed = Stoped.Subtract(Start); // Вычитаем из Stoped (когда код выполнился) время Start (когда код запустили на выполнение) MessageBox.Show(Convert.ToString(Elapsed.TotalMilliseconds)); // Время выполнения в миллисекундах с плавующей запятой MessageBox.Show(Convert.ToString(Elapsed.Seconds)); // Время выполнения в секундах >

Похожие записи:

Метки: Время выполнения кода, Время выполнения участка кода, выполнение кода Евгений Просмотров: 20 535 Запись опубликована в 12:10

Есть что сказать? Тогда действуй!

Гуляющее меню

  • Главная
  • Обратная связь
  • ИнтеллигенцияX
  • Исходники.NET
  • Исходники и примеры
  • Уроки VB.NET
  • Уроки Delphi 7
  • Уроки PascalABC.NET
  • Простая база данных на Delphi7
  • База данных в бесплатном аналоге Delphi — среде разработки Lazarus
  • Простая база данных на MS Visual Studio 2014 и MS SQL Server
  • Простая база данных на PHP и MySQL
  • Как работать из PHP с базой данных PostgreSQL
  • Как работать с базой данных SQLite в Android Studio
  • Карта блога

Опросы читателей

Я рекомендую

  • Бесплатная программа для учета клиентов и заказов
  • Веселая игра, где в конце надо убить оборотня
  • Разработка сайтов «Вятка IT»
  • Уроки программирования (Visual Basic, C++ Builder)

Свежак

  • GPT: нейросеть, которая может написать все, что угодно. Или почти все…
  • Как ускорить Windows? 10 простых советов!
  • 11 интересных фактов из мира крипты
  • Не пора ли покупать «дешевую» крипту?
  • Альткоины медленно захватывают рынок криптовалют

Рубрики ИнтеллигенцииX

  • Android (14)
  • Corel Draw (1)
  • Microsoft Office (10)
  • PHP (7)
  • SEO (4)
  • Visual Studio (10)
  • WordPress (10)
  • Видео-обзоры (14)
  • Главная ценность (6)
  • Игры (15)
  • Из жизни (10)
  • Интернет (14)
  • Информац. новости (15)
  • История (4)
  • Крипта (19)
  • Мои разработки (5)
  • Нейронки (1)
  • Новости (33)
  • Новости блога (39)
  • Обновление блога (1)
  • Одобряю (13)
  • Осторожно! Развод (2)
  • Отдых, праздники (20)
  • Полезно знать (45)
  • Презентации (7)
  • Приколы (8)
  • Примеры C# (3)
  • Произведения (3)
  • Разное (45)
  • Софт (20)
  • Творчество читателей (10)
  • Уроки C# (16)
  • Уроки PascalABC.NET (3)
  • Уроки Visual Basic.NET (119)
  • Фильмы (23)
  • Хостинг и домен (6)

Источник: ds-release.ru

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