Возможно, вам нужно увеличить частоту тиков, которая может быть установлена по умолчанию до 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