В моей программе я сейчас пытаюсь получить живое обновление регистров чипа. Это живое обновление должно быть через определенные промежутки времени, 60 Гц и 120 Гц являются общими, но, если возможно, 200 Гц будет еще лучше.Qt C++ timing issue
Во всяком случае, я хочу оптимизировать свои циклы, так как скорость критическая. Чтобы увидеть, где медленные части, я использую QElapsedTimer для измерения прошедших наносекунд. Я в настоящее время застрял, что, кажется, массивные накладные расходы для/while циклов в Qt.
Код:
QElapsedTimer outsideloop;
QElapsedTimer insideloop;
int totalinside = 0;
outsideloop.start();
while(x<reg.size())
{
insideloop.start();
//get registers from chip
//process register values
x++;
totalinside+= insideloop.nsecsElapsed();
}
qDebug()<<"Time elapsed Outside:"<<outsideloop.nsecsElapsed();<<"inside:"<<totalinside;
Теперь время только «внутри» петли часто около 4-5 миллисекунд меньше времени, измеренного «снаружи» петля. Чтобы дать вам пример, «внутри» часто измеряется около 5 мс, а снаружи часто составляет около 10 мс. Иногда разница меньше (1 мс), а иногда и намного больше (15-30 мс). Эта разница также существует, когда я использую цикл for.
Кроме того, я измерил время, потребуется, чтобы зайти и выйти из цикла, как так:
nstimer.start();
while(x<reg.size())
{
qDebug()<<"Time to get into loop"<<nstimer.nsecsElapsed();
nstimer.start();
}
qDebug()<<"Time to get out of loop"<<nstimer.nsecsElapsed();
Это занимает около 0.005ms каждый на моей системе так не очень актуальна.
Я не уверен, что вызывает это, потому что на самом деле это не постоянная задержка. Я хотел бы иметь все как можно быстрее и, таким образом, устранить эту дополнительную временную разницу, которая вызывает у меня проблемы.
Извинения за мою неопытность, если я пропустил очевидное.
Спасибо!
Трудно помочь, когда ваш пример не завершен. Например, не зная тип 'reg', мы не знаем, насколько медленным будет' reg.size() '. –
Кроме того, полезно поделиться своей командой компиляции, чтобы мы могли видеть, что вы использовали '-O3', а не просто предполагали, что не забыли ... –
Обратите внимание, что на большинстве настольных ОС вы не будете получать надежное поведение в режиме реального времени; «промежутки выполнения» в 10-20 миллисекунд являются общими (они происходят, когда ОС запускает какую-то другую задачу вместо вашей собственной задачи, на некоторое время), и если компьютер находится под нагрузкой, пробелы могут быть намного длиннее этого. Если вам нужно поведение в реальном времени (и я согласен с ответом Кубы ниже, это звучит так, как вы этого не сделали), тогда вам нужно будет работать в ОС реального времени. –