Что такое астрономическое время работы программы

Содержание

Длительность можно задавать не только в рабочих, но и в астрономических единицах. В этом случае график выполнения задачи не будет прерываться на выходные дни и праздники, задача будет выполняться и в нерабочее время тоже. Никакие изменения календарей такой задачи касаться не будут.
Злоупотреблять такими оценками не стоит, они уместны только если обусловлены технологическими особенностями задачи.
Для оценки длительности в астрономических единицах достаточно приписать перед буквенным обозначением единицы букву А (в русской версии программы) или E (в английской).
Например:
1ад – одни сутки
5ад – 5 суток
1 ан – ровно 7 суток
1амес – ровно 30 суток

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

Почему программистам сложно работать со временем в программах

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

Как измерить время выполнения кода | Изучение С++ для начинающих. Урок #145

На эту статью нас вдохновило видео Тома Скотта из канала Computerphile. Если вы знаете английский, посмотрите оригинальный ролик, там много английского юмора:

Вводные

Допустим, мы пишем программу, которая посчитает, сколько секунд, минут или дней прошло с какого-либо солнечного затмения, наблюдаемого из разных точек Земли за её историю. У нас есть перечень наблюдений: «Такого-то числа в такое-то время в таком-то городе такой-то страны было замечено солнечное затмение» — и этот перечень пополняется с каждым затмением.

Кажется, что это простая программа, которая берёт текущую дату, вычитает из неё дату предыдущего затмения и получает ответ.

Но не всё так просто.

Нестандартные часовые пояса

Из школьного курса географии мы знаем, что:

  • земной шар делится на часовые пояса;
  • в каждом часовом поясе — своё время;
  • для единой точки отсчёта используют нулевой меридиан в Гринвиче (его называют UTC);
  • есть единый список часовых поясов, которым пользуются все желающие.
Читайте также:
Когда появились антивирусные программы

Сложность в том, что не во всех странах время совпадает с тем, которое должно быть в этом часовом поясе. Например, у Австралии своё время — UTC+9:30. Это значит, что там на 9 с половиной часов больше, чем на нулевом меридиане. Такое дробное значение часового пояса вносит хаос в наши таблицы, но пока можно справляться.

Кроме Австралии есть ещё несколько стран со своим временем, например Непал (UTC+5:45), Индия (UTC+5:30) или Канада (UTC−3:30). Чтобы перейти на своё время, стране не нужно это ни с кем согласовывать — она просто решает это внутри себя, а потом объявляет всем остальным.

Значит, нам в программе нужно учесть полный список стран, каждую со своим поясом, а ещё предусмотреть автоматическое обновление списка — вдруг какая страна решит перейти на своё отдельное время. А также иметь всю историю принадлежности территорий к часовым поясам: вдруг двести лет назад какая-то страна меняла часовой пояс?

Летнее и зимнее время

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

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

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

Но бывает так, что страна решает отказаться от перехода на зимнее или на летнее время — как Россия в 2011 году. Это значит, что все программы, которые работают со временем, должны заранее обновиться, чтобы всё дальше считалось точно.

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

Внезапная смена даты

Иногда бывает так, что страны, которые расположены возле линии перемены дат, могут пропустить день. Например, Самоа однажды объявила всем, что у них после 29 декабря 2011 года будет сразу 31 декабря — так им проще торговать с Австралией.

Поэтому нам нужно постоянно отслеживать страны возле линии перемены дат, не собираются ли они сделать что-то подобное снова. Если собираются — вносим это изменение в код программы, чтобы она продолжила считать всё правильно.

Политическая обстановка

На работу со временем могут влиять даже отношения между странами. Самый популярный пример: Израиль, Западный берег Иордана и отношения с палестинцами. Смысл такой: Палестина живёт по своему времени, Израиль — по своему, а на Западном берегу реки Иордан всё сложно: часть служб, фирм живут по палестинскому времени, а другая часть — по израильскому.

Запрограммировать на уровне скрипта это невозможно — нам нужно будет при первом запуске вручную уточнить у пользователя, по какому времени вести отсчёт.

Исторические календари

Постепенно подбираемся к сложным вопросам — а как считать время, которое было раньше, в старых календарях? Тогда ведь тоже фиксировали затмения, там есть много ценных данных. Все тонкости переходов нужно тоже учесть.

Например, в одной стране при переходе от юлианского к григорианскому календарю просто прибавили три недели к дате с какого-то момента в 18-м веке. В другой сделали то же самое, но не в 18-м веке, а лет 40 назад. Сюда же добавляется русский календарь со старым и новым стилем — и это тоже нужно учитывать в программе, если мы хотим, чтобы она находила правильное расстояние между событиями.

Решение — добавить в программу все старые календари и правила перехода между датами для каждой страны.

Отдельно нужно ещё учитывать разность в календарях — откуда начинался отсчёт нового года в каждой стране в разное время. Например, до 17-го века в Англии год начинался 25 марта. Это значит, что даты шли так: 23 марта 1509 → 24 марта 1509 → 25 марта 1510 → 26 марта 1510 → … → 31 декабря 1510 → 1 января 1510 →…

Читайте также:
Ms dos как установить программу

Продвинутый уровень — високосная секунда

До этого момента мы говорили только про дни и часы, но что, если у нас стоит задача посчитать прошедшее время с точностью до секунды? И здесь тоже всё сложно: из-за неравномерного вращения Земли у нас время от времени появляются високосные секунды.

Чтобы наша программа точно учитывала время, она должна получить сигнал от приборов или от сервера астрофизиков, что в мире прошла високосная секунда. И в этот момент внутренние часы после, например, 23:59:59 показывают 23:59:60!

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

Что дальше

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

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

Презентация на тему Измерение времени в ЭВМ

Цели измерения времени оценка производительности ЭВМ на тестовых задачах; оценка эффективности программы; выявление фрагментов программы, подлежащих оптимизации; прочее (работа с устройствами ввода/вывода, организация многозадачности, работа с мультимедиа, системы реального времени).

  • Главная
  • Информатика
  • Измерение времени в ЭВМ

Слайды и текст этой презентации

Слайд 1Измерение времени в ЭВМ
В.П. Маркова, М.Б. Остапкевич
Новосибирск
2014
НГТУ

ФПМИ
Кафедра параллельного программирования

Измерение времени в ЭВМ В.П. Маркова, М.Б. Остапкевич Новосибирск 2014 НГТУ ФПМИ Кафедра параллельного программирования

Слайд 2Цели измерения времени
оценка производительности ЭВМ на тестовых

задачах;
оценка эффективности программы;
выявление фрагментов программы, подлежащих оптимизации;
прочее

(работа с устройствами ввода/вывода, организация многозадачности, работа с мультимедиа, системы реального времени).

Цели измерения времени оценка производительности ЭВМ на тестовых задачах; оценка эффективности программы;

Слайд 3Временная шкала событий в ЭВМ
(для системы с

тактовой частотой 1 ГГц)

Временная шкала событий в ЭВМ (для системы с тактовой частотой 1 ГГц)

Слайд 4Уровни средств измерения времени
утилиты;

Уровни средств измерения времени утилиты; библиотеки подпрограмм; ядро ОС; аппаратное обеспечение.

Слайд 5Основные способы измерения времени в ОС Linux

Основные способы измерения времени в ОС Linux

Слайд 6Аппаратное обеспечение в архитектуре x86 для измерения

времени
RTC – Real Time Clock
PIT – Programmable

Interrupt Controller
HPET – High Precision Event Timer
APIC – Advanced Programmable Interrupt Controller
ACPI Power Management Timer
GPS receiver

Аппаратное обеспечение в архитектуре x86 для измерения времени RTC – Real Time

Слайд 7RTC – часы реального времени
Отсчет времени даже

когда компьютер выключен
Периодическая (2 – 8192 Гц)

или однократная генерация прерывания RTC (IRQ8)
Доступ к функциям RTC через порты ввода/вывода 0x70, 0x71

RTC – часы реального времени Отсчет времени даже когда компьютер выключен Периодическая

Слайд 8PIT – программируемый интервальный таймер
Периодическая (100 –

1000 Гц в Linux) генерация прерывания таймера

(IRQ0)
Доступ к функциям PIT через порты ввода/вывода 0x40 — 0x43

PIT – программируемый интервальный таймер Периодическая (100 – 1000 Гц в Linux)

Слайд 9HPET – высокоточный таймер событий
Периодическая (до 10

МГц) или однократная генерация прерывания таймера;
до 8

счетчиков с собственной частотой;
до 32 таймеров на каждый счетчик.

HPET – высокоточный таймер событий Периодическая (до 10 МГц) или однократная генерация

Слайд 10TSC – счетчик тактов
точный для измерения малых

промежутков времени до 10 мсек.;
зависит от

архитектуры, есть не для всех архитектур;
в SMP нужна привязка процессов;
в современных процессорах с переменной тактовой частотой пользоваться счетчиком затруднительно.

TSC – счетчик тактов точный для измерения малых промежутков времени до 10

Слайд 11Основные способы измерения времени в ОС Linux

Основные способы измерения времени в ОС Linux

Слайд 12Таймеры в ядре ОС
realtime timer
– астрономическое время
(одинаково

для всех процессов, запущенных на компьютере)

time;
thread time.

Таймеры в ядре ОС realtime timer – астрономическое время (одинаково для всех

Слайд 13Измерение временных интервалов в языке Си
Измерение времени

работы программы в многозадачной операционной системе (Windows,

Linux, …) имеет свои особенности. В такой системе каждый процессор (ядро) всегда выполняет несколько процессов (программ) в режиме разделения времени.
Операционная система выделяет каждому процессу квант времени процессора и управляет переключением процессора с одного процесса на другой. Таким образом, если замерить время работы некоторой программы внешним хронометром, отражающим реальное течение времени, то этот интервал попадет и время работы каких-то других процессов.

квант времени процессора

Измерение временных интервалов в языке Си Измерение времени работы программы в многозадачной

Слайд 14Измерение времени в системах с разделением времени

Измерение времени в системах с разделением времени

Слайд 15Основные способы измерения времени в ОС Linux

Основные способы измерения времени в ОС Linux

Слайд 16Уровень библиотек
Windows:
GetSystemTime(), GetTickCount(),
time(), clock(),

Уровень библиотек Windows: GetSystemTime(), GetTickCount(), time(), clock(), Linux: gettimeofday(), time(), clock(), clock_gettime().

Слайд 17Измерение системного времени Счетчик системного времени
Вычислительная система

имеет несколько программных и аппаратных счетчиков, отражающих

течение времени с различных точек зрения. Необходимо различать следующие счетчики:

Счетчик системного времени (system time, wall-clock time) – программный счетчик, который отражает течение времени с точки зрения операционной системы и, как правило, соответствует реальному течению времени. Значение системного времени в каждый момент одинаково для всех программ, работающих на данном компьютере.

Функции для измерения системного времени:
Windows: GetSystemTime(), GetTickCount(), time(), clock(),
Linux: gettimeofday(), time(), clock(), clock_gettime.

Измерение системного времени Счетчик системного времени Вычислительная система имеет несколько программных

Слайд 18Измерение системного времени
Функция
int gettimeofday(struct timeval *tv,

struct timezone *tz)
возвращает в полях tv_sec и

tv_usec переменной tv количество секунд и микросекунд, прошедших с полуночи 1 января 1970 года.
Пример использования:
#include
struct timeval tv1, tv2, dtv;
struct timezone tz;
//функция для начала замера времени, сохраняющая в переменной tv1 время начала измерений
void time_start()
< gettimeofday(tz); >
//функция для окончания замера времени, возвращающая количество миллисекунд, прошедших с начала замера времени
long time_stop()
< gettimeofday(tz);
dtv.tv_sec= tv2.tv_sec — tv1.tv_sec; //разница секунд
dtv.tv_usec=tv2.tv_usec — tv1.tv_usec; //разница микросекунд
if (dtv.tv_usec

Читайте также:
Отзывы о программе spotlight

Слайд 19Измерение системного времени
Функция
clock_t clock()
возвращает количество тактов,

прошедших с момента запуска программы
#include
clock_t tm;
void

time_start() < tm = clock(); >
long time_stop()
return (clock() – tm)*1000/CLOCKS_PER_SEC;
>

CLOCKS_PER_SEC – константа, значение которой равно количеству тактов исполняемых за секунду. Таким образом, (clock() – tm)*1000/CLOCKS_PER_SEC – количество миллисекунд, прошедших с «момента времени» tm.

Измерение системного времени Функция clock_t clock() возвращает количество тактов, прошедших с

Слайд 20Измерение времени процесса Счетчик времени процесса
Счетчик времени

процесса (process time, CPU time) – программный

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

Функции для получения времени процесса:
Windows: GetThreadTimes(),GetProcessTimes(),
Linux: times().

Измерение времени процесса Счетчик времени процесса Счетчик времени процесса (process time,

Слайд 21Измерение времени процесса
Функция
clock_t times (tms *buffer)
Возвращает в

поле tms_utime переменной buffer количество тактов, потраченных

на исполнение инструкций пользовательского процесса с момента начала его исполнения; в поле tms_stime переменной buffer количество тактов, затраченных на исполнение системных вызовов инициированных процессом.

Использование функции times. Перевод тактов в миллисекунды производится так же, как и в примере для функции clock.

#include
#include
struct tms tmsBegin,tmsEnd;
void time_start() < times( >
long time_stop()
< times(
return ((tmsEnd.tms_utime — tmsBegin.tms_utime)+
(tmsEnd.tms_stime — tmsBegin.tms_stime))*
1000/CLOCKS_PER_SEC;
>

Измерение времени процесса Функция clock_t times (tms *buffer) Возвращает в поле tms_utime

Слайд 22Измерение времени процесса Счетчик тактов процессора
Счетчик тактов

процессора (CPU time stamp counter) – аппаратный

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

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

x86/x86-64: rdtsc (Read Time Stamp Counter)
Alpha: rpcc,
Itanium: ar.itc,
PowerPC: mftb, mftbu.

Измерение времени процесса Счетчик тактов процессора Счетчик тактов процессора (CPU time

Слайд 23Счетчик тактов процессора
rdtsc — ассемблерная инструкция

для платформы x86, читающая счётчик TSC (Time

Stamp Counter) и возвращающая его в регистрах EDX:EAX 64-битное количество тактов с момента последнего сброса процессора.

Пример использования инструкции rdtsc в ОС Linux:

#include
long long TimeValue=0;
//функция, возвращающая количество тактов, прошедших с момента последнего сброса процессора
unsigned long long time_RDTSC()
< union ticks
< unsigned long long tx;
struct dblword < long tl,th; >dw;
> t;
asm(«rdtscn»: «=a»(t.dw.tl),»=d»(t.dw.th));
return t.tx;
>
void time_start() < TimeValue=time_RDTSC(); >
long long time_stop() <
return (time_RDTSC()-TimeValue)*1000/CLOCKS_PER_SEC;
>

Счетчик тактов процессора rdtsc - ассемблерная инструкция для платформы x86, читающая

Слайд 24Счетчик тактов процессора
Пример использования инструкции rdtsc

в Windows, MS Visual C++:

#include
unsigned __int64

unsigned __int64 rdtsc(void)
<
return __rdtsc();
>

void time_start() < TimeValue=rdtsc(); >
long long time_stop() <
return (rdtsc()-TimeValue)*1000/CLOCKS_PER_SEC;
>

Счетчик тактов процессора Пример использования инструкции rdtsc в Windows, MS Visual

Слайд 25Идентификатор таймера в clock_gettime
CLOCK_REALTIME
System-wide realtime clock.

Setting this clock requires appropriate privileges.
CLOCK_MONOTONIC

_RAW
Clock that cannot be set and represents monotonic time since some unspecified starting point.
CLOCK_PROCESS_CPUTIME_ID
High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
Thread-specific CPU-time clock.

Идентификатор таймера в clock_gettime CLOCK_REALTIME System-wide realtime clock. Setting this clock

Слайд 26int main( int argc, char **argv )

struct timespec start, stop; double

if( clock_gettime( CLOCK_MONOTONIC_RAW, clock gettime» ); exit( EXIT_FAILURE );
>

if( clock_gettime( CLOCK_MONOTONIC_RAW, clock gettime» ); exit( EXIT_FAILURE );
>

accum = ( stop.tv_sec — start.tv_sec ) +
( stop.tv_nsec — start.tv_nsec ) / BILLION;
printf( «%lfn», accum );
return( EXIT_SUCCESS );
>

int main( int argc, char **argv )< struct timespec start,

Слайд 27Основные способы измерения времени в ОС Linux

Основные способы измерения времени в ОС Linux

Слайд 28Уровень утилит
Утилиты измерения времени выполнения программы —

time
real – общее время работы программы согласно

системному таймеру;
user – время, которое работал процесс (кроме выполнения системных вызовов);
sys – время, затраченное процессом на выполнение системных вызовов программы.
Профилировщики
GNU Profiler (gprof)

Уровень утилит Утилиты измерения времени выполнения программы - time real – общее

Слайд 29Основные способы измерения времени в ОС Linux

Основные способы измерения времени в ОС Linux

Слайд 30Факторы, вносящие искажения в измерение интервалов времени
Исполняемые

процессы многозадачной ОС
Влияние кода, измеряющего время
Состояние ЭВМ

перед началом измеряемого интервала (например, что хранится в кэш-памяти, дисковом кэше)

Факторы, вносящие искажения в измерение интервалов времени Исполняемые процессы многозадачной ОС Влияние

Слайд 31Пути уменьшения влияния факторов, вносящих искажения
Остановка лишних

процессов
Многократное повторение измерений
Сброс дискового кэша
Уменьшение числа обращений

к таймерам
Многократное повторение счета, увеличивающее время измеряемого интервала

Пути уменьшения влияния факторов, вносящих искажения Остановка лишних процессов Многократное повторение измерений

Слайд 32Пути уменьшения влияния факторов, вносящих искажения
Другие процессы

в многозадачных операционных системах
остановить другие приложения, оставить

активными только необходимые сервисы или демоны ОС,
сделать несколько замеров, взять минимальное значение.
Виртуальная память, дисковый кэш
запускать сброс дискового кэша (sync в Linux) перед каждым запуском программы,
сделать несколько замеров, взять минимальное значение.
Разрешающая способность способа измерения времени
Подобрать способ в соответствии с априорной оценкой продолжительности.

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

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