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

Я реализовал быструю функцию, которая возвращает время (используя 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() «атомно» как можно?

0

Решение

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

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

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

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

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

2

Другие решения


По вопросам рекламы [email protected]