Как вызывать две функции одну за другой с минимальной задержкой?

Я реализовал быструю функцию, которая возвращает время (используя rdtsc), давайте назовем это fast_time(), У меня есть для справки оригинальная функция, которая использует системный вызов, давайте назовем его system_time(), Моя программа использует fast_time() но в отдельном потоке я постоянно запускаю цикл while, чтобы проверить, больше ли разница между временем, возвращаемым из функции my, и исходной функцией, чем заранее заданный порог. Что-то вроде

while (true)
{
    if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
    {
        report error
    }
}

Обычно я не вижу ошибок, но иногда я их получаю и хотел бы лучше понять эту проблему. Мое первое подозрение в том, что призыв к system_time() не происходит сразу после fast_time() возвращается. Как я могу заставить программу выполнить fast_time() - system_time() "атомно" как можно?

1 ответ

rdtsc - ненадежный способ измерения в реальном времени по нескольким причинам:

1) каждый поток HW будет возвращать разные значения, поэтому, если ваш поток не привязан к одному потоку HW, вы получите разные значения. Так что время может неожиданно перейти назад и вперед в зависимости от того, как ОС планирует поток

И что еще более важно:

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

Кроме того, в вашем конкретном тестовом примере ОС может запланировать поток для выполнения между вызовами fast_time() и system_time(), что приведет к отклонению между измеренными временами, даже если fast_time() вернет правильные значения. Поэтому, чтобы ответить на ваш вопрос, я не думаю, что есть способ предотвратить это.

Другие вопросы по тегам