Вычислениe времени выполнения участка кода на Си/C++. Часть 2: функция clock_gettime

Некоторое время назад мне понадобилось измерить время работы одного алгоритма, и я нашел быстрое решение для этого: Вычислениe времени выполнения участка кода на Си/C++. Дальнейшее исследование показало, что способ этот отнюдь не идеален.

Метод измерения времени

Итак, есть два основных типа измерение времени работы программы: измерение процессорного времени, то есть времени, которое процессор фактически потратил на выполнение заданного кода, и измерение так называемого wall-clock time - времени, которое реально прошло от старта программы до окончания ее работы. Основная разница между этими двумя измерениями заключается в том, что про измерении wall-clock time учитывается также время, которое процессор потратил на обработку других процессов. Соответственно, при разной загрузке системы, wall-clock time может отличаться для одного и того же кода. Также при наличии, например, записи в файл, время записи тоже будет включено в wall-clock time.  Поэтому при измерении времени работы алгоритмов (а именно для этого я использую измерение времени), предпочтительнее смотреть именно на процессорное время.

Wall-clock time

В случае, если все-таки необходимо использовать wall-clock time (например, в случае профайлинга операций, включающих запись на носитель, или сетевое взаимодействие), использованная мной раньше функция gettimeofday() тоже плохо подходит по следующим причинам:

  • gettimeofday() использует приблизительное время, рассчитанное исходя из последнего замера системного времени. На примере это можно показать так: я смотрю на часы, они показывают 10:03. Примерно через 40 минут вы спрашиваете у меня, сколько сейчас времени, и я отвечаю: "примерно 10:43". Потом я опять смотрю на часы, а на часах еще 10:37. Вы снова спрашиваете меня через минуту: "а сейчас сколько времени", на что я отвечаю: "10:38". Получается, что в реальном мире прошла минута, а по вашим замерам время ушло назад на 5 минут (10:43 - 10:38). Такие вещи могут случаться, если последовательно использовать gettimeofday() для рассчета временных интервалов. 
  •  gettimeofday() может возвращать неравномерно возрастающее время, например, если реализация NTP изменяет время системы. Хотя современные реализации NTP не изменют системное время скачкообразно, но они могу заставлять его изменяться быстрее или медленнее, чтоб сократить разницу. 
  • Так же другой процесс может изменить системное время, с помощью, например, функции settimeofday(). Таким образом, время с точки зрения функции gettimeofday() будет изменяться даже не монотонно, а скачком.
Для получения wall-clock time в POSIX системах рекомендуется использовать функцию clock_gettime(), которой в качестве параметра можно указать id таймера, с помощью которого вы собираетесь замерять время. В частности, можно передать CLOCK_REALTIME и получить те же измерения, что и для gettimeofday(). Если передать CLOCK_MONOTONIC, то функция вернет время, возрастающее монотонно, однако все же подверженное изменеиям со стороны реализации NTP, то есть возрастающее не равномерно. Можно также передать CLOCK_MONOTONIC_RAW - вот тогда время будет возрастать монотонно и равномерно. Для не-POSIX систем в стандарте С++11, например, есть библиотека  std::chrono::high_resolution_clock.

Измерение процессорного времени

Я нашел два основных метода измерения процессорного времени (я искал для Linux).
  • clock() - для всех платформ;
  • уже упомянутая clock_gettime() с параметрами CLOCK_PROCESS_CPUTIME_ID или CLOCK_THREAD_CPUTIME_ID в параметрах - для POSIX.
Функция clock() измеряет процессорное время, не зависит от платформы, но при этом имеет меньшее разрешение, нежели clock_gettime(), как указано, например, здесь и подтверждается экспериментами.
Итак, если нужно измерить процессорное время на POSIX системе (а это именно мой случай), то рекомендуется использовать функцию clock_gettime() с параметром CLOCK_PROCESS_CPUTIME_ID для измерения времени для текущего процесса или с параметром CLOCK_THREAD_CPUTIME_ID - для измерения времени для текущего потока.  Ну и в заключение, как использовать clock_gettime():
#include <sys/time.h>

#include <time.h>

#define NS_IN_S  1E9

int main()
{
    struct timespec start, stop, duration;

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

    //Код, время выполнения которого нужно измерить

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);

    //Вычисления длительности в виде timespec
    if ((stop.tv_nsec - start.tv_nsec) < 0) 
    {
        duration.tv_sec = stop.tv_sec - start.tv_sec - 1;
        duration.tv_nsec = NS_IN_S + stop.tv_nsec - start.tv_nsec;
    } 
    else 
    {
        duration.tv_sec = stop.tv_sec - start.tv_sec;
        duration.tv_nsec = stop.tv_nsec - start.tv_nsec;
    }

    //Если нужен результат в секундах 
    double result = duration.tv_sec + duration.tv_nsec / NS_IN_S;

    return 0;
}

9 комментариев :

  1. VarangaOfficial - варанга цена и отзывы - мы работаем только с официальными источниками, и предоставляем вниманию наших пользователей исключительно проверенные, не подвергающиеся сомнениям, факты. Воспользовавшись нашим сайтом, вы сможете узнать исчерпывающую информацию касающуюся представленного средства. Увидеть данные о проведенных клинических исследований, прочитать отзывы реальных пациентов и медицинского персонала. Изучить инструкцию по применению, прочитать об особенностях и методах работы мази, уяснить, в чем заключаются особенности работы крема Варанга, где необходимо заказывать сертифицированный, оригинальный препарат и, как не нарваться на подделку. Мы тщательно проверяем размещаемые данные. Предоставляем пользователям нашего ресурса сведения, почерпнутые только из достоверных источников. Если вы обнаружили признаки появления грибка или же долго и безрезультатно стараетесь излечиться от этого неприятного коварного недуга, на нашем сайте вы отыщете простой и быстрый способ устранения проблемы. Присоединяетесь и живите полноценной, здоровой жизнью. Мы собрали ответы на все вопросы на одном информационном ресурсе.

    ОтветитьУдалить
  2. Территория бонго-чата с куклами! Этот эротический видеочат позволяет вам любоваться самыми красивыми русскими женщинами, которые публикуются онлайн прямо из своих комнат. В бонго-чате девушки будут безвозмездно и безрассудно участвовать в своих персиках, если жажда любопытства собеседника сможет их убедить. Нетрудно открыться для непринужденного общения в бонго-чате с русскими женщинами абсолютно бесплатно. Тонны положительных впечатлений ждут вас в лагерях бонго-чата с цыпочками. Вам не стоит спешить, здесь выложено действительно большое разнообразие вариантов, очаровательные лица которых не дадут поводов долго решать, кого из них следует соблазнить в первую очередь. Статус наших эксортесс просто без загрузки, лагеря видеочата бонго позаботились о таких проблемах. Вы можете убедиться, что в интернете мало что может быть приятнее прямого обсуждения. Здесь это нельзя сравнить с поиском записи или монотонной ленты, это зависит только от контакта с моделью в порядке настоящего времени, а также от любого слова, расцветет ли улыбка на ее милом лице. Далее - более того, для этого организован бонго-чат с барышнями, чтобы ничто не ограничивалось одним общением. Русские девушки будут делать такие трюки бесплатно, что вам обязательно захочется посетить этот чат бонго снова в ближайшее время. Скучно просто следить за чужим сексуальным представлением, поэтому имеет смысл забежать в порно чат с красотками и превратиться в полноценного участника такого действа. Предлагаемая эксклюзивная возможность визуального общения не оставит равнодушным ни одного мужчину. Достаточно просто часто кликать в чатах бонго с девушками. У владельцев есть некоторые вопросы о том, где и сколько вы можете приручить онлайн чат с девушками порно, У вас может быть возможность нажать на менеджера на локальной платформе.

    ОтветитьУдалить
  3. Банки Финансовые учреждения предоставляют кредитные карты, но у них есть нюансы - высокая комиссия за годовое обслуживание переводов и инкассацию в банкоматах. Ломбарды выдают микрозаймы до зарплаты под залог имущества - ювелирных изделий, оборудования. Когда образуется задержка, ломбард имеет возможность реализовать ценности. Продукт должен соответствовать определенным параметрам. Они не примут оборудование, пришедшее в негодность, займ онлайн Неликвидные ювелирные изделия. Также минус - это довольно нормальный процент. Отличный вариант, но не знакомые могут помочь занять до зарплаты с нашего сайта. Обычно друзья и родственники дают средства без комиссии, и даже в микрофинансовой организации сейчас реально воспользоваться беспроцентным кредитом в рамках акции. Мфо предлагают услугу "микрокредит до зарплаты". Заполнение и зарабатывание денег возможно через интернет. Необходимо заполнить стандартный запрос, и банкноты и монеты зачисляются на личную карту мгновенно. Не нужно давать задаток, приходите на работу, чтобы подписать договор. Когда деньги нужны надолго и быстро, лучший способ - позвонить в микрофинансовую организацию. Возврат средств предлагается в течение 15 месяцев. Переплата небольшая, потому что кредит предоставляется на короткий срок. Пример. Заемщик хочет занять 10 000 тнг ровно на две недели. Ставка по кредиту составляет 2 % в день. Вам нужно вернуть 12800 тнг. Комиссия составит 1280 тнг.

    ОтветитьУдалить
  4. В больнице займов "скромные суммы быстро и четко выдаются под проценты займ онлайн. Люди, которым срочно нужны деньги, могут воспользоваться микрозаймом до получения аванса, набрав бесплатный номер телефона или заполнив заявку в нашем интернет-магазине. После отправки заказа наш сотрудник связывается с пользователем в течение получаса и сообщает о принятом решении. В ситуации, когда это положительно, заявитель выбирает наиболее удобный способ получения кредита - в каком-нибудь из офисов или с доставкой в офис и квартиру. Чтобы перевести сумму, вам нужно найти нужные деньги и срок кредита. Определено несколько видов кредитов, для частых пользователей предоставляются кредиты со сниженной процентной ставкой. При предоставлении промо-кода возможен кредит до 7 тысяч рублей. В газете под 0%. 1. Для того, чтобы получить кредит, вам необходимо перейти на соответствующую кнопку: 2. После этого вы будете перенаправлены на страницу официального сайта производителя "центр займов" (centrzaimov.Ru), где вы можете использовать интерактивный калькулятор, чтобы выбрать желаемые характеристики (деньги и продолжительность) для предоставления вам кредита: Повышенное внимание при выборе кредитного продукта следует уделять доступным категориям заемщиков. Иногда для постоянных клиентов компании начисление процентов уменьшается с каждым выданным кредитом. Специальные условия действуют также для инвалидов. Вы можете узнать больше о процентной ставке в своем личном кабинете; 3. После выбора условий, заполнения контактной информации (фио, дата рождения, номер телефона для связи, регион оформления кредита) и нажатия кнопки "получить средства" вы полностью изучаете заявку. Это необходимо для быстрой подачи заказа.

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

    ОтветитьУдалить
  6. Каждый мужик хотя бы раз в своей жизни безусловно сталкивался с обломами. Попробуй припомнить эту историю: ты гуляешь с шикарной девченкой, истратил козны на цветы, шампанское и конфеты, а обмен получал более поцелуйчик в щечку интим досуг за деньги в Москве ну смс-ку на ночь. Но с проституткой ты точно получишь данную сладкую дырочку! Уж чем предпочесть страстный секс с ночной феей, нежели выпрашивать его у что,этой, кот-ая способна принять подарочки, а тебя оставить ни с чем, согласен?

    ОтветитьУдалить
  7. Когда отберёте понравившееся вознаграждение, придёт время прокрутить вейджер. Это одно из основных требований, полагая неотъемлемой верификации. Если на веб-сайте учтена обязательная процедура подтверждения личности 1xslots casino, то ликвидировать выигрыш получится только последствии проверки данных. Приготовьтесь наполнить анкету и выслать в техподдержку документ, подтверждающий лицо.

    ОтветитьУдалить
  8. Закупать ссылки стопам для низкочастотных запросов, потом – среднечастотных, последствии – высокочастотных где купить ссылки для продвижения сайта. Отбираем страницы, формируем оригинальные анкоры и начинаем находить доноров. Желательно покупать 1-2 бэклинка сутки, максимально – 3-4. Главное – творить все умеренно. Если незамедлительно купить большое рекомендаций, велика возможность попасть под фильтр от Google.

    ОтветитьУдалить
  9. Легко получить. Есть число каталогов и сервисов, позволяющих покупка ссылок для продвижения сайта в задаром заполучить массу таких назначений. Конкуренции между 2-мя ресурсами нет, в сего замен ссылками не сделает конфликтных обстановок.

    ОтветитьУдалить