zoceb
@zoceb
В копюшоне и темных очках

На сколько ресурса затратно операция получения даты — микросекунд с 1970 в современных языках?

Представим что нам нужно очень часто получать нано секунды или микро секунды через стандартную ф-ю языка.
И задумаешься на сколько это ресурса затратно.

И тяжелее ли получать нано секунды чем микро секунды или мили секунды.
Или эти операции мало затратны и эти значения в каждый момент содержатся в окружении языка или ос и без вызовов?
Суть вопроса изложил вполне, надеюсь на ваш опыт и может кто реально тестировал на каком либо из языков.
  • Вопрос задан
  • 477 просмотров
Решения вопроса 4
@nirvimel
На большинстве (всех?) современных ОС получение времени - это функция ядра. Следовательно для пользовательского процесса в userspace это требует ровно один вызов в ядро, который представляет собой syscall, то есть программное прерывание. На стороне ядра код обычно тривиальный и заключается в получении значения переменной, в которой хранится время (эта переменная инкрементируется из обработчика прерывания таймера), и возврате этого значения через sysret, то есть возврат из прерывания. Поэтому основные временные затраты сводятся к исполнению syscall/sysret и сохранению/восстановлению контекста пользовательского процесса при входе/выходе в/из ядра.
От единиц измерения (нано/мирко/милли) скорость вызова практически не зависит. Конвертация одних единиц в другие происходит на стороне пользовательского процесса, за это отвечают библиотеки и окружение конкретного языка, но эти вычисления составляют всего несколько машинных инструкций и не вносят значительный вклад общее время вызова.

В Linux существуют несколько таймеров в ядре: высокого/обычного разрешения и переводимые/непереводимые назад, но получение времени происходит через одну функцию clock_gettime как бы по-разному это не выглядело в разных ЯВУ.

В Windows стандартные механизмы GetSystemTime и GetTickCount выдают время только с миллисекундной точностью. А таймер высокого разрешения QueryPerformanceCounter предназначен только для измерения временных интервалов, его абсолютное значение не имеет смысла.

Историческая справка: В реальном режиме работы x86 до тех пор, пока BIOS владеет аппаратным прерыванием таймера и таймер настроен по умолчанию (его еще можно перенастраивать), то есть с интервалом в 55ms и частотой в 18.2 герц, на каждый тик таймера инкрементируется четырехбайтное значение по абсолютному адресу 0:046C. Так что пользовательская программа (термин процесс тут не совсем применим) может получить значение времени мгновенно простым считыванием этого значения из памяти без каких-либо вызовов.
Стоит отметить, что данный функционал не имеет никакого отношения к DOS или какой-либо ОС вообще, а прошит в BIOS любого x86-совместимого (даже современного) компьютера и действителен каждый раз при загрузке машины вплоть до момента перевода процессора в защищенный режим в момент загрузки ядра современной ОС.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
за время отвечает микросхема, которая постоянно хранит текущее значение.
Получить текущее время с наносекундами или с микросекундами - совершенно одинаковые затраты.
Вопрос в том, что вы подразумеваете под "слишком часто", поскольку вы можете получать не совсем корректные показатели.

Скажем милисекунды уже могут быть неверными - каждые 10-100 милисекунд ядро ОС переключает выполнение между парралельными процессами, и запросить время 10 раз в секунду, уже может выдавать не истинное значение.
Ответ написан
@fdrwitch
Наверное Зависит от процА. Читайте, например, man 2 nanosleep (nanosleep - high-resolution sleep), или
man 3 ualarm Поспрашивайте у Сишников
Ответ написан
tzlom
@tzlom
Для частого и максимально точного времени:
OS:
clock_gettime( CLOCK_REALTIME

Windows:
QueryPerformanceFrequency + QueryPerformanceCounter

Mac:
mach_timebase_info + mach_absolute_time

ну а дальше при желании корректируем до UNIX timestamp
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы