Я оцениваю производительность цикла ожидания занятости для запуска событий с постоянными интервалами. Я заметил, некоторые странное поведение, используя следующий код:Переменная производительность цикла ожидания ожидания?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int timespec_subtract(struct timespec *, struct timespec, struct timespec);
int main(int argc, char *argv[]) {
int iterations = atoi(argv[1])+1;
struct timespec t[2], diff;
for (int i = 0; i < iterations; i++) {
clock_gettime(CLOCK_MONOTONIC, &t[0]);
static volatile int i;
for (i = 0; i < 200000; i++)
;
clock_gettime(CLOCK_MONOTONIC, &t[1]);
timespec_subtract(&diff, t[1], t[0]);
printf("%ld\n", diff.tv_sec * 1000000000 + diff.tv_nsec);
}
}
На тестовой машине (двойной 14-жильный E5-2683 v3 @ 2.00Ghz, 256GB DDR4), 200k итераций для цикла составляет около 1 мс. Или, может быть, не так:
1030854
1060237
1012797
1011479
1025307
1017299
1011001
1038725
1017361
... (about 700 lines later)
638466
638546
638446
640422
638468
638457
638468
638398
638493
640242
... (about 200 lines later)
606460
607013
606449
608813
606542
606484
606990
606436
606491
606466
... (about 3000 lines later)
404367
404307
404309
404306
404270
404370
404280
404395
404342
406005
Когда раз смещаться вниз в третий раз, они остаются в основном соответствует (в течение примерно 2 или 3 мкс), за время от времени подпрыгивая до 450us за несколько сотен итераций, за исключением. Такое поведение повторяется на аналогичных машинах и во многих прогонах.
Я понимаю, что компилятор оптимизирован для циклов занятости, но я не думаю, что это проблема здесь. Я не думаю, что кэш должен влиять на него, потому что не должно быть никаких недействительных, и не будет объяснять внезапную оптимизацию. Я также попытался использовать регистр int для счетчика циклов без заметного эффекта.
Любые мысли о том, что происходит, и как сделать это (более) последовательным?
РЕДАКТИРОВАТЬ: Для получения информации, запуск этой программы с помощью usleep, nanosleep или показанного оживленного ожидания для 10k итераций показывает ~ 20000 непроизвольных переключателей контекста с time -v
.
Разрывы, вероятно, переключение контекста. – Mysticial
Извините, но ваш подход совершенно неправ. Таким образом, вы не можете получить истинно надежное время в такой же системе. Это, безусловно, XY-проблема. Пожалуйста, укажите, что вы ** на самом деле ** хотите выполнить, и все соответствующие детали. – Olaf
На самом деле я хочу понять, почему производительность цикла занятости изменяется, как я уже сказал в заголовке вопроса. Я знаю об альтернативных методах выбора времени моей программы. – Rakurai