usec что это время

Заблуждения программистов о Unix-времени

Вчера Дэнни поинтересовался любопытными фактами о Unix-времени, а я вспомнил, что иногда оно работает совершенно неинтуитивно.

Вот эти три факта кажутся в высшей степени разумными и логичными, не так ли?


Настольные часы 1770-х годов. Собрано Джоном Леру. Из коллекции Wellcome. Опубликовано под лицензией CC BY

У всех трёх заблуждений одна причина: високосные секунды. Если вы не знакомы с дополнительными секундами, вот краткая справка:

Время UTC определяется двумя факторами:

Когда два времени выпадают из синхрона, в UTC добавляется или удаляется секунда, чтобы вернуть синхронизацию. С 1972 года служба IERS (которая управляет этим делом) добавила 27 дополнительных секунд. В результате получилось 27 суток UTC продолжительностью в 86 401 секунду. Теоретически возможно появление суток продолжительностью 86 399 секунд (минус одна). Оба варианта противоречат фундаментальному предположению о Unix-времени.

Время Unix предполагает, что каждый день длится ровно 86 400 секунд (60 × 60 × 24 = 86 400), без всяких дополнительных секунд. Если происходит такой скачок, то время Unix либо перепрыгивает через секунду, либо отсчитывая две секунды за одну. По состоянию на 2019 год в нём отсутствует 27 високосных секунд.

Так что наши заблуждения нужно дополнить следующим образом:

До сих пор на практике секунды никогда не удалялись (и замедление вращения Земли означает, что это маловероятно), но если бы это когда-либо произошло, это означало бы, что день UTC стал на одну секунду короче. В этом случае последняя секунда UTC (23:59:59) отбрасывается.

В каждых сутках Unix одинаковое количество секунд, поэтому последняя Unix-секунда укороченного дня не будет соответствовать никакому времени UTC. Вот как это выглядит, в интервалах по четверти секунды:

Это уже 27 раз произошло на практике. По окончании суток UTC добавляют дополнительную секунду 23:59:60. В сутках Unix одинаковое количество секунд, поэтому он не может добавить дополнительную секунду — вместо этого приходится повторять метки времени Unix для последней секунды. Вот как это выглядит, в интервалах по четверти секунды:

Если стартовать в 23:59:60.50 и подождать полсекунды, время Unix возвращается на полсекунды, а метка времени Unix 101 соответствует двум секундам UTC.

Вероятно, это не единственные странности времени Unix — только то, что я вчера вспомнил.

Источник

Usec что это время

ОПИСАНИЕ

и задающей количество секунд и микросекунд с начала эпохи (см. time (2)).

Аргумент tz является timezone :

Использование структуры timezone является устаревшим методом: поле tz_dsttime никогда не использовалось в Linux, оно не поддерживается и не будет поддерживаться libc или glibc. Любое появление этого поля в исходных версиях ядра (за исключением его описания) является ошибкой. Поэтому все, что описано ниже, представляет собой только исторический интерес. Поле tz_dsttime содержит символьную постоянную (значения приведены ниже), которая включает в себя информацию о сезонной коррекции времени (Daylight Saving Time). (Замечание: эта величина постоянна и указывает лишь на алгоритм коррекции.) Алгоритмы сезонной коррекции определяются так :

DST_NONE /* без коррекции */

DST_USA /* коррекция для Америки */

DST_AUST /* коррекция для Австралии */

DST_WET /* коррекция для Западной Европы */

DST_MET /* коррекция для Центральной Европы */

DST_EET /* коррекция для Восточной Европы */

DST_CAN /* коррекция для Канады */

DST_GB /* Коррекция для Великобритании */

DST_RUM /* коррекция для Румынии */

DST_TUR /* коррекция для Турции */

DST_AUSTALT /* коррекция со сдвигом в 1986 для Австралии */

Разумеется, коррекцию для каждой страны нельзя описать простым алгоритмом, так как этот фактор может зависеть даже от непредсказуемых политических решений. Поэтому этот метод представления часовых поясов больше не используется. В Linux при вызове settimeofday поле tz_dsttime должно содержать нулевое значение.

В Linux существует специфическое понятие `часовой сдвиг’, связанное с функцией settimeofday tz не равен NULL, а параметр tv равен NULL, и значение поля tz_minuteswest не равно нулю. В этом случае предполагается, что время аппаратных часов (CMOS clock) местное и к ним дожен быть добавлен этот параметр для того, чтобы получилось время UTC. Но, как мы и говорили, использовать этот метод не рекомендуется.

Для работы со структурой timeval существуют следующие макросы:

Если tv или tz равно нулю, то соответствующая структура не заполняется или не возвращается.

Источник

C/C++: как измерять процессорное время


КДПВ

P.S. Когда в статье написано «сегодня» или «сейчас», имеется ввиду «на момент выхода статьи», то есть, если я не ошибаюсь, март 2012. Ни я, ни автор не гарантируем, что это до сих пор так.
P.P.S. На момент публикации оригинал недоступен, но хранится в кэше Яндекса

Функции API, позволяющие получить процессорное время, использованное процессом, отличаются в разных операционных системах: Windows, Linux, OSX, BSD, Solaris, а также прочих UNIX-подобных ОС. Эта статья предоставляет кросс-платформенную функцию, получающую процессорное время процесса и объясняет, какие функции поддерживает каждая ОС.

Читайте также:  Что такое картун кэт в реальной жизни

Как получить процессорное время

Процессорное время увеличивается, когда процесс работает и потребляет циклы CPU. Во время операций ввода-вывода, блокировок потоков и других операций, которые приостанавливают работу процессора, процессорное время не увеличивается пока процесс снова не начнет использовать CPU.

Разные инструменты, такие как ps в POSIX, Activity Monitor в OSX и Task Manager в Windows показывают процессорное время, используемое процессами, но часто бывает полезным отслеживать его прямо из самого процесса. Это особенно полезно во время бенчмаркинга алгоритмов или маленькой части сложной программы. Несмотря на то, что все ОС предоставляют API для получения процессорного времени, в каждой из них есть свои тонкости.

Далее мы подробно обсудим все функции, тонкости и причины, по которым в коде столько #ifdef ‘ов.

Использование

Чтобы замерить процессорное время алгоритма, вызовите getCPUTime( ) до и после запуска алгоритма, и выведите разницу. Не стоит предполагать, что значение, возвращенное при единичном вызове функции, несет какой-то смысл.

Обсуждение

Каждая ОС предоставляет один или несколько способов получить процессорное время. Однако некоторые способы точнее остальных.

OS clock clock_gettime GetProcessTimes getrusage times
AIX yes yes yes yes
BSD yes yes yes yes
HP-UX yes yes yes yes
Linux yes yes yes yes
OSX yes yes yes
Solaris yes yes yes yes
Windows yes

Каждый из этих способов подробно освещен ниже.

GetProcessTimes( )

На Windows и Cygwin (UNIX-подобная среда и интерфейс командной строки для Windows), функция GetProcessTimes( ) заполняет структуру FILETIME процессорным временем, использованным процессом, а функция FileTimeToSystemTime( ) конвертирует структуру FILETIME в структуру SYSTEMTIME, содержащую пригодное для использования значение времени.

Доступность GetProcessTimes( ): Cygwin, Windows XP и более поздние версии.

Получение процессорного времени:

clock_gettme( )

Однако, есть несколько тонкостей, затрудняющих использование этой функции в кросс-платформенном коде:

На практике из-за всех этих тонкостей, использование clock_gettime( ) требует много проверок с помощью #ifdef и возможность переключиться на другую функцию, если она не срабатывает.

Доступность clock_gettime( ): AIX, BSD, Cygwin, HP-UX, Linux и Solaris. Но clock id на BSD и HP-UX нестандартные.

Доступность clock_getres( ): AIX, BSD, Cygwin, HP-UX и Linux, но не работает Solaris.

Доступность clock_getcpuclockid( ): AIX и Cygwin, не недостоверна на Linux.

Получение процессорного времени:

getrusage( )

На всех UNIX-подобных ОС, функция getrusage( ) это самый надежный способ получить процессорное время, использованное текущим процессом. Функция заполняет структуру rusage временем в секундах и микросекундах. Поле ru_utime содержит время проведенное в user mode, а поле ru_stime — в system mode от имени процесса.

Доступность getrusage( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX, and Solaris.

Получение процессорного времени:

times( )

На всех UNIX-подобных ОС, устаревшая функция times( ) заполняет структуру tms с процессорным временем в тиках, а функция sysconf( ) возвращает количество тиков в секунду. Поле tms_utime содержит время, проведенное в user mode, а поле tms_stime — в system mode от имени процесса.

Внимание: Более старый аргумент функции sysconf( ) CLK_TCK устарел и может не поддерживаться в некоторых ОС. Если он доступен, функция sysconf( ) обычно не работает при его использовании. Используйте _SC_CLK_TCK вместо него.

Доступность times( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX и Solaris.

Получение процессорного времени:

clock( )

На всех UNIX-подобных ОС, очень старая функция clock( ) возвращает процессорное время процесса в тиках, а макрос CLOCKS_PER_SEC количество тиков в секунду.

Заметка: Возвращенное процессорное время включает в себя время проведенное в user mode И в system mode от имени процесса.

Внимание: Хотя изначально CLOCKS_PER_SEC должен был возвращать значение, зависящее от процессора, стандарты C ISO C89 и C99, Single UNIX Specification и стандарт POSIX требуют, чтобы CLOCKS_PER_SEC имел фиксированное значение 1,000,000, что ограничивает точность функции микросекундами. Большинство ОС соответствует этим стандартам, но FreeBSD, Cygwin и старые версии OSX используют нестандартные значения.

Внимание: В Windows, функция clock( ) поддерживается, но возвращает не процессорное, а реальное время.

Доступность clock( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX и Solaris.

Получение процессорного времени:

Другие подходы

Существуют и другие ОС-специфичные способы получить процессорное время. На Linux, Solarisи некоторых BSD, можно парсить /proc/[pid]/stat, чтобы получить статистику процесса. На OSX, приватная функция API proc_pidtaskinfo( ) в libproc возвращает информацию о процессе. Также существуют открытые библиотеки, такие как libproc, procps и Sigar.

На UNIX существует несколько утилит позволяющих отобразить процессорное время процесса, включая ps, top, mpstat и другие. Можно также использовать утилиту time, чтобы отобразить время, потраченное на команду.

На Windows, можно использовать диспетчер задач, чтобы мониторить использование CPU.

На OSX, можно использовать Activity Monitor, чтобы мониторить использование CPU. Утилита для профайлинга Instruments поставляемая в комплекте с Xcode может мониторить использование CPU, а также много других вещей.

Источник

Русские Блоги

Функции времени, связанные с Linux

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

Тип времени

1.1 time_t

На самом деле, длинное целое число, представляет время UTC (0: 0AM 0:05 1 января 1970 года, время эпохи системы Linux) к текущей системе вторичной разницы во времени, обычно используется для временных функций:

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

Кроме того, если вы хотите сравнить разницу времени между двумя раз, вы можете использовать функцию Difftime ():

1.2 struct tm

Структура TM называется взорванным временем в стандарте ANSI. Из определения следующего мы также можем увидеть, что время разлагается в очень подробную область.

Функция функции MKTime () точно противоположная, и она преобразует структуру TM в Time_T тип времени.

Функция ASCTIME () представляет собой время и дату представления структуры TM в наше привычное использование и возвращается в строку.

1.3 struct timeval

Структура Timeval может получить время точности уровня MS, которая определяется следующим образом:

Функция, используемая структурой Timeval: GetTimeOfDay () и SettimeOfDay ():

1.4 struct timespec

Структура TimeSpec может обеспечить более высокие значения времени прецизионного времени, а уровень NS определяется следующим образом:

Соответствующая функция: clock_getime ():

Если CLK_ID используется для разработки соответствующего типа часов, могут использоваться разные типы для получения различных значений времени, с четырьмя видами:

2. Преобразование типа времени

2.1 Время преобразования типа

Введенные соответствующие функции времени и соответствующие функции обработки, давайте сделаем простой сводку различных типов времени, как показано ниже:

Большинство функций на рисунке были описаны в разделе 1, где две функции используются в структурных типах TM и пользователь, определенные в типе структуры TM и определенным пользователем. Convert между форматом отображения.

Функция STRFTIME () преобразует формат TM в формат формата и поместите его в главный адрес, а формат общего формата:

Функция STRPTIME () выполняет противоположную работу, преобразуйте функцию Rentime () обратно в формат структуры TM. Это определяется следующим образом:

2.2 Пример

После того, как рассказываю это, давайте пройдем простой пример:

3. Задержка функции и функции таймера

3.1 Функция сна

В пространстве пользователя Linux мы можем использовать семейство функции Sleep, чтобы добиться отложенных функций, следующие три функции сна обеспечивают три прецизионные задержки:

3.2 Функция задержки

В слое ядра Linux мы можем использовать семейство функции задержки для достижения различных функций времени точности:

3.3 Таймер Функция

Функции таймера, доступные в системе Linux, имеют много, такие как тревоги, выберите и многое другое. Этот раздел введет высокоточный таймер, который поставляется из стандарта POSIX. Так же, как нить, описанная выше, различные механизмы синхронизации, которые также имеют набор таких функций, как создание, удаление, съемку, настройка, все из которых включены в файл Time.h.

Создать таймер

(1). clockid_t: Используемые типы таймеров, в основном включают в себя:

среди них sigev_notify Говорят, что есть несколько способов:

2. Начать таймер

Для new_value it_value используется для указания времени истечения срока действия текущего таймера. Когда таймер истекает, значение iT_Value будет обновляться в значение iT_Interval. Если значение iT_Interval равно 0, таймер не является планировщиком пространства временного пространства, и после истечения истечения IT_Value, он вернется к состоянию SCASTAPT.

Иногда приложение запускает таймер с интервалом времени, затем измените интервал времени таймера, который может быть реализован путем изменения new_value; если приложение хочет понять интервал времени перед изменением набора временных интервалов, его передается NONULL OLL_VALUE POINTER, поэтому, когда return returs time_settime () red_value сохраняет последнюю настройку интервала времени таймера. В большинстве случаев нам это не нужно, вы можете просто установить Old_Value на NULL, игнорируйте его.

Флаги только 2: 0 и Timer_abStime. Когда флаги 0, new_value-> it_value означает, что время времени, когда таймер сначала истек (например, я надеюсь, что время 2 секунды через 2 секунды); когда флаги Timer_abStime, new_value-> it_value означает первое завершение абсолютного времени ( Например, когда таймер истекает в 01:23:45); если new_value-> it_value установите абсолютное время, чем текущее абсолютное время, то таймер истекает немедленно; если часы clock_realtime отрегулируются, первое время таймера скорректирован соответствующим образом.

3. Получите оставшееся время таймера

4. Количество превышающих ограничений для получения таймеров

Возможно, что таймер истекает, и сигнал, генерируемый в последнее время таймера, все еще находится в приостановленном состоянии. В этом случае один из сигналов может быть потерян. Это ограниченный по времени таймера. Программа может определить это переполнение количества исключений, вызывая Timer_GetoverRun. Оверксирующий таймер может происходить только на сигнале, генерируемом тем же таймером. Несколькими таймерами, даже те таймеры, которые используют те же часы и сигналы, сгенерированные сигналы будут очереде, не потерявшись.

6. Удалить таймер

3.4 Пример

Давайте посмотрим на примере использования таймера:

Примечание:

Написано в WEN: эта статья является основной запиской, договоренностью главы и содержание AUPUE. Есть упущения или неправильные места в тексте, пожалуйста, также просветите меня.

Источник

Время выполнения программы C

у меня есть программа на C, которая стремится работать параллельно на нескольких процессорах. Мне нужно иметь возможность записывать время выполнения (которое может быть от 1 секунды до нескольких минут). Я искал ответы, но все они, похоже, предлагают использовать clock() функция, которая затем включает в себя вычисление количества часов, взятых программой, разделенной на Clocks_per_second значение.

Я не уверен, как Clocks_per_second стоимость рассчитывается?

в Java, я просто взял текущее время в миллисекундах до и после выполнения.

есть ли подобная вещь в C? Я посмотрел, но, похоже, не могу найти способ получить что-то лучше, чем второе разрешение.

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

13 ответов

обратите внимание, что это возвращает время в виде с плавающей точкой. Это может быть более точным, чем второй (например, вы измеряете 4.52 секунды). Точность зависит от архитектуры; на современных системах вы легко получаете 10 мс или ниже, но на старых машинах Windows (с эпохи Win98) это было ближе к 60 мс.

clock() стандартный C; он работает «везде.» Существуют системные функции, такие как getrusage() в Unix-подобных системах.

в Java System.currentTimeMillis() не измеряет то же самое. Это «настенные часы»: он может помочь вам измерить, сколько времени потребовалось для выполнения программы, но он не говорит вам, сколько времени процессора было использовано. В многозадачных системах (т. е. во всех) они могут быть совершенно разными.

Если вы используете оболочку Unix для запуска, вы можете использовать команду time.

предполагая a.out как исполняемый файл даст u время, необходимое для запуска этого

вы функционально хотите этого:

обратите внимание, что измеряется в микросекундах, а не только секунд.

в простой ванили C:

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

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

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

зная, что способ получения текущего времени в C может быть достигнут разными способами, Проще:

надеюсь, что это помогает.

ANSI C указывает только функции времени второй точности. Однако, если вы работаете в среде POSIX вы можете использовать gettimeofday() функция, которая обеспечивает разрешение микросекунд времени, прошедшего с эпохи UNIX.

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

Источник

Читайте также:  какие стойки выбрать на ниссан альмера классик
Информ портал о технике и не только