- Как получить текущее время в миллисекундах с C в Linux?
- Команда Linux, чтобы получить время в миллисекундах
- C++ получение миллисекунд времени на Linux-clock (), похоже, работает неправильно
- 16 ответов
- How to: Display Milliseconds in Date and Time Values
- To display the millisecond component of a DateTime value
- Example
- Эквивалент С++ для GetLocalTime в Linux (с миллисекундами!)
Как получить текущее время в миллисекундах с C в Linux?
Как узнать текущее время в Linux в миллисекундах?
Этого можно добиться с помощью функции POSIX clock_gettime .
В текущей версии POSIX, gettimeofday будет отмечен устаревшими . Это означает, что он может быть удален из будущей версии спецификации. Разработчикам приложений рекомендуется использовать эту clock_gettime функцию вместо gettimeofday .
Вот пример того, как использовать clock_gettime :
Если ваша цель — измерить прошедшее время, и ваша система поддерживает параметр «монотонные часы», вам следует рассмотреть возможность использования CLOCK_MONOTONIC вместо CLOCK_REALTIME .
Вам нужно сделать что-то вроде этого:
Ниже приведена функция util для получения текущей отметки времени в миллисекундах:
О часовом поясе :
gettimeofday () поддерживает указание часового пояса, я использую NULL , что игнорирует часовой пояс, но вы можете указать часовой пояс, если необходимо.
@Update — часовой пояс
Поскольку long представление времени не имеет отношения к самому tz часовому поясу и не зависит от него , установка param для gettimeofday () не требуется, поскольку это не будет иметь никакого значения.
И, по словам мужчины странице gettimeofday() , использование timezone структуры является устаревшим, поэтому tz аргумент должен нормально быть указан как NULL, для информации , пожалуйста , смотрите страницы.
Источник
Команда Linux, чтобы получить время в миллисекундах
Есть ли команда оболочки в Linux, чтобы получить время в миллисекундах?
date +%s возвращает число секунд с эпохи.
date +%s%N возвращает количество секунд + текущие наносекунды.
Следовательно, echo $(($(date +%s%N)/1000000)) – это то, что вам нужно
date +»%T.%N» возвращает текущее время с наносекундами.
date +»%T.%6N» возвращает текущее время с наносекундами, округленными до первых 6 цифр, что составляет микросекунды.
date +»%T.%3N» возвращает текущее время с наносекундами, округленными до первых трех цифр, что составляет миллисекунды.
В общем, каждому полю формата команды date может быть задана дополнительная ширина поля.
nano составляет 10 -9 и милли 10 -3 . Следовательно, мы можем использовать 3 первых символа наносекунд, чтобы получить милли:
% N наносекунды (000000000..999999999)
% s секунд с 1970-01-01 00:00:00 UTC
В OS X, где date не поддерживает флаг %N , я рекомендую установить coreutils с помощью homebrew.
Это даст вам доступ к команде под названием gdate , которая будет вести себя как date в системах Linux.
Для более “родного” опыта вы всегда можете добавить это в свой .bash_aliases
Другие ответы, вероятно, достаточны в большинстве случаев, но я думал, что добавлю свои 2 цента, когда столкнулся с проблемой в системе busybox.
Данная система не поддерживает формат формата %N и не имеет интерпретатора python или perl .
После большой царапины головы мы (спасибо Дейву!) пришли к следующему:
Он извлекает секунды и микросекунды с выхода adjtimex (обычно используется для установки параметров для системных часов) и печатает их без новых строк (чтобы они склеивались). Обратите внимание, что поле микросекунд должно быть предварительно заполнено нулями, но это никак не влияет на поле секунд, которое больше 6 цифр. Из этого следует тривиально преобразовать микросекунды в миллисекунды.
Если вам нужна новая новая строка (возможно, потому, что она выглядит лучше), попробуйте
Также обратите внимание, что для этого требуется adjtimex и awk . Если нет, то с помощью busybox вы можете указать их локально с помощью
И затем вызовите вышеуказанное как
Или, конечно, вы можете поместить их в свой PATH
Вышеописанное работает на моем устройстве busybox. На Ubuntu я попробовал то же самое и понял, что adjtimex имеет разные версии. На Ubuntu это работало для вывода времени в секундах с десятичными знаками на микросекунды (включая завершающую новую строку)
Я бы этого не сделал на Ubuntu. Я бы использовал date +%s%N
date команда не выдавала миллисекунды на OS X, поэтому использовала псевдоним из python
python script следующим образом:
Просто хотел добавить к @Alper ответ, что я должен был сделать, чтобы заставить этот материал работать:
На Mac вам понадобится brew install coreutils , чтобы мы могли использовать gdate . В противном случае в Linux это просто date . И эта функция поможет вам командам времени без создания временных файлов или чего-либо:
И вы можете использовать его со строкой timeit ‘tsc —noEmit’
Источник
C++ получение миллисекунд времени на Linux-clock (), похоже, работает неправильно
На Windows, clock() возвращает время в миллисекундах, но в этом окне Linux, над которым я работаю, он округляет его до ближайшего 1000, поэтому точность только до «второго» уровня, а не до уровня миллисекунд.
Я нашел решение с Qt, используя QTime класса, создание экземпляра объекта и вызов start() на нем тогда вызов elapsed() чтобы получить количество миллисекунд, прошедших.
мне повезло, потому что я работаю с Qt для начала, но я хотел бы решение, которое не зависит от сторонних библиотек,
нет стандартного способа сделать это?
обновление
пожалуйста, не рекомендуйте Boost ..
если Boost и Qt могут это сделать, конечно, это не магия, должно быть что-то стандартное, что они используют!
16 ответов
вы можете использовать gettimeofday в начале и конце вашего метода, а затем отличить две возвращаемые структуры. Вы получите структуру, подобную следующей:
обратите внимание: clock тут не измерения времени. Это означает, что если ваша программа занимает 5 секунд, clock не будет измерять 5 секунд обязательно, но может больше (ваша программа может запускать несколько потоков и поэтому может потреблять больше процессора, чем в реальном времени) или меньше. Он измеряет приближение процессорного времени используется. Чтобы увидеть разницу рассмотрим этот код
он выводит на моей системе
потому что все, что мы сделали спать и не использовать время процессора! Однако, используя gettimeofday мы получаем то, что хотим (?)
выходы в моей системе
Если вам нужно больше точности, но хотите сделать процессорного времени, то вы можете рассмотреть возможность использования
я также рекомендую инструменты, предлагаемые Boost. Либо упомянутый таймер повышения, либо взломать что-то из Boost.DateTime или есть новая предлагаемая библиотека в песочнице -импульс.Хроно!—14—>: этот последний будет заменой таймера и будет иметь:
- утилиты времени стандартной библиотеки C++0x, включая:
- шаблон класса duration
- шаблон класса time_point
- часы:
- system_clock
- monotonic_clock
- high_resolution_clock
- шаблон класса timer , С typedefs:
- system_timer
- monotonic_timer
- high_resolution_timer
- процесс часы и таймеры:
- process_clock , захватывая реальным, пользователей-ЦП и системы-процессора раза.
- process_timer , захват истекшего реального, пользователь-CPU, и система-CPU раз.
- run_timer , удобная отчетность / process_timer / results.
- рациональная арифметика времени компиляции стандартной библиотеки C++0x.
вот источник из списка объектов
Я написал Timer класса на основе ответ CTT. Его можно использовать следующим образом:
вот его реализация:
Если вам не нужен код для переноски в старые unices, вы можете использовать clock_gettime (), который даст вам время в наносекунд (Если ваш процессор поддерживает эту резолюцию). Это POSIX, но с 2001 года.
clock () имеет часто довольно паршивое разрешение. Если вы хотите измерить время на миллисекундном уровне, одной из альтернатив является использование clock_gettime (), as описано в этом вопросе.
(помните, что вам нужно связать с-lrt в Linux).
С C++11 и std::chrono::high_resolution_clock можно сделать так:
Источник
How to: Display Milliseconds in Date and Time Values
The default date and time formatting methods, such as DateTime.ToString(), include the hours, minutes, and seconds of a time value but exclude its milliseconds component. This topic shows how to include a date and time’s millisecond component in formatted date and time strings.
To display the millisecond component of a DateTime value
If you are working with the string representation of a date, convert it to a DateTime or a DateTimeOffset value by using the static DateTime.Parse(String) or DateTimeOffset.Parse(String) method.
To extract the string representation of a time’s millisecond component, call the date and time value’s DateTime.ToString(String) or ToString method, and pass the fff or FFF custom format pattern either alone or with other custom format specifiers as the format parameter.
Example
The example displays the millisecond component of a DateTime and a DateTimeOffset value to the console, both alone and included in a longer date and time string.
The fff format pattern includes any trailing zeros in the millisecond value. The FFF format pattern suppresses them. The difference is illustrated in the following example.
A problem with defining a complete custom format specifier that includes the millisecond component of a date and time is that it defines a hard-coded format that may not correspond to the arrangement of time elements in the application’s current culture. A better alternative is to retrieve one of the date and time display patterns defined by the current culture’s DateTimeFormatInfo object and modify it to include milliseconds. The example also illustrates this approach. It retrieves the current culture’s full date and time pattern from the DateTimeFormatInfo.FullDateTimePattern property, and then inserts the custom pattern .ffff after its seconds pattern. Note that the example uses a regular expression to perform this operation in a single method call.
You can also use a custom format specifier to display a fractional part of seconds other than milliseconds. For example, the f or F custom format specifier displays tenths of a second, the ff or FF custom format specifier displays hundredths of a second, and the ffff or FFFF custom format specifier displays ten thousandths of a second. Fractional parts of a millisecond are truncated instead of rounded in the returned string. These format specifiers are used in the following example.
It is possible to display very small fractional units of a second, such as ten thousandths of a second or hundred-thousandths of a second. However, these values may not be meaningful. The precision of a date and time value depends on the resolution of the operating system clock. For more information, see the API your operating system uses:
Источник
Эквивалент С++ для GetLocalTime в Linux (с миллисекундами!)
Я искал более часа, но я просто не могу найти решение!
Я ищу функцию, которая дает мне аналогичную структуру, как GetLocalTime в Windows. Для меня важно то, что эта структура имеет часы, минуты, секунды и миллисекунды.
localtime() не включает миллисекунды, и поэтому я не могу его использовать!
Я бы оценил решение, которое использует стандартную библиотеку или другую очень маленькую библиотеку, так как я работаю над малиной Pi и connot, использую большие библиотеки, такие как boost!
Как уже упоминалось выше, нет прямого эквивалента. Если вы можете использовать C++ 11, заголовок позволяет получить тот же результат, но не в одном вызове. Вы можете использовать high_resolution_clock для получения текущего времени Unix в миллисекундах, тогда вы можете получить функцию localtime C, чтобы получить время без миллисекунд, и использовать текущее время Unix в миллисекундах, чтобы найти миллисекунды. Похоже, вам придется написать собственную реализацию GetLocalTime , но с C++ 11 она не будет сложной.
GetLocalTime не является обычной функцией Linux.
Время чтения (7), вы, вероятно, хотите clock_gettime (2) или (как прокомментировал Йоахим Пилеборг), более старый gettimeofday (2)
Если вам нужна какая-то struct дающая все часы, минуты, секунды, миллисекунды, вы должны сами ее использовать, используя localtime (3) и явно вычисляя миллисекунду.
Что-то вроде приведенного ниже кода печатает время с миллисекундами
Вы можете использовать комбинацию:
- clock_gettime(CLOCK_REALTIME) ; возвращает местное время, до миллисекунды (конечно, ограниченное фактическим разрешением часов); не заботится о локальной информации о часовом поясе, возвращает время UTC. Просто используйте информацию в миллисекундах (из поля tv_nsec ).
time() ; возвращает местное время, до второго — без миллисекунды — также время UTC. time() ( time_t ) легко преобразовать в окончательный формат.
затем преобразовать результат time(), используя localtime_r() ; это создает структуру, очень похожую на Windows SYSTEMTIME ; результат до второго, и учитывает местную информацию о часовом поясе.
наконец, настройте миллисекундное поле с использованием результатов clock_gettime() .
Эти процедуры документированы, а не устарели, переносимы.
Возможно, вам потребуется вызвать tzset() один раз (это задает информацию о часовом поясе — глобальную переменную C — из операционной системы — возможно, тяжелую операцию).
Источник