Windows QueryPerformanceCounter с MinGW C - PullRequest
       7

Windows QueryPerformanceCounter с MinGW C

0 голосов
/ 27 августа 2018

Я пытаюсь измерить время отклика при установлении связи по последовательному протоколу, потянув QueryPerformanceCounter (QPC). Моя целевая система - win7 на Asrock D1800b Intel Dual Core, компилируемая с последней версией MinGw (6.3.0-1).

Для проверки QPC у меня есть этот код:

#include <windows.h>
#include <stdio.h>

void main() 
{
    //performance timers
    LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
    LARGE_INTEGER Frequency;

    QueryPerformanceFrequency(&Frequency);
    for (int i = 0 ; i < 10 ; i++) 
    {
        QueryPerformanceCounter(&StartingTime);
        Sleep(10); //ms
        QueryPerformanceCounter(&EndingTime);
        ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
        ElapsedMicroseconds.QuadPart *= 1000000;                //first scale up counts
        ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;     //then convert to us
        printf("elapsed=%li\n", ElapsedMicroseconds.QuadPart);
    }

}

При запуске на целевой системе я получаю: (без других нагрузок)

истекшее = 5341
истекший = 14086
истекший = 13818
истекший = 14322
истекший = 15305
истекший = 8867
истекший = 12162
истекший = 14225
истекший = 13333
прошло = 14751

Но при запуске на развивающейся системе (Win10, Intel i5) я получаю этот весьма последовательный результат

истекшее = 11326
истекший = 11556
истекший = 12630
истекший = 11583
истекший = 11749
истекший = 12644
истекший = 12562
истекший = 11690
истекший = 11726
истекший = 11664

Оба приведенных выше результата являются примерами гораздо большего прогона.

ожидаемый результат где-то выше 10000us.

Итак, есть идеи о том, что происходит в целевой системе?

1 Ответ

0 голосов
/ 28 августа 2018

Возможно, вам нужно увеличить частоту тиков, которая может быть установлена ​​по умолчанию до 64 Гц (15,625 мс на тик), чтобы Sleep (10) работал должным образом. Вы можете увеличить его до 1000 Гц (1 мс на такт). Это увеличит издержки прерывания, но результаты должны быть более последовательными. Пример кода:

    timeBeginPeriod(1);                     /* set ticker to 1000 hz */
    Sleep(128);                             /* wait for it to settle */
    /* ... benchmark code */
    timeEndPeriod(1);                       /* restore ticker to default */

Обратите внимание, что, хотя Windows не является операционной системой реального времени, в Windows возможно заставить поток работать с фиксированной частотой без какого-либо дрейфа, и, по возможности, использовать Sleep (1), чтобы избежать привязки процессора к фиксированной частоте. нить. Запуск потока с немного более высоким приоритетом поможет, если есть конкурирующие потоки. Это часто используется играми, которым нужен поток «физического движка», который работает с фиксированной частотой. Пример кода включен в ответ на этот старый вопрос:

Как правильно координировать потоки на основе фиксированной частоты цикла?

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

 100 deltas in ms:

  9.99973023  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00676775  10.00002346 
 10.00002346  10.00002346  10.00794067  10.00002346 
  9.99973023  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00618129  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346   9.99973023  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00090315  10.00148961  10.00148961  10.00090315 
 10.00002346  10.00178284  10.00002346  10.00002346 
 10.00295576  10.00002346  10.00882036  10.00500837 
 10.00002346  10.00559483  10.00559483  10.00647452 
 10.00588806  10.00735421  10.00676775  10.00764744 
 10.00002346  10.00002346  10.00823390  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346   9.99973023  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346   9.99973023 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346   9.99973023 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 
 10.00002346  10.00002346  10.00002346  10.00002346 

elapsed time in ms:

1000.000000000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...