2016-12-12 3 views
1

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

Я не уверен, что вызывает это, потому что на самом деле это не постоянная задержка. Я хотел бы иметь все как можно быстрее и, таким образом, устранить эту дополнительную временную разницу, которая вызывает у меня проблемы.

Извинения за мою неопытность, если я пропустил очевидное.

Спасибо!

+0

Трудно помочь, когда ваш пример не завершен. Например, не зная тип 'reg', мы не знаем, насколько медленным будет' reg.size() '. –

+0

Кроме того, полезно поделиться своей командой компиляции, чтобы мы могли видеть, что вы использовали '-O3', а не просто предполагали, что не забыли ... –

+0

Обратите внимание, что на большинстве настольных ОС вы не будете получать надежное поведение в режиме реального времени; «промежутки выполнения» в 10-20 миллисекунд являются общими (они происходят, когда ОС запускает какую-то другую задачу вместо вашей собственной задачи, на некоторое время), и если компьютер находится под нагрузкой, пробелы могут быть намного длиннее этого. Если вам нужно поведение в реальном времени (и я согласен с ответом Кубы ниже, это звучит так, как вы этого не сделали), тогда вам нужно будет работать в ОС реального времени. –

ответ

1

Нет необходимости делать обновления быстрее, чем скорость обновления экрана. Если вам нужно привязать к скорости обновления экрана, вам придется реализовать свой пользовательский интерфейс с использованием OpenGL или D3D и получить новые данные с чипа после каждого vsync.

Но я сомневаюсь в необходимости любого из этого. Будет множество ценностей, и человек, который потребляет это, в любом случае не может много сделать с ними при такой быстрой скорости обновления. Помните, что люди занимают около 200 мс для обработки текстового/числового значения. Если вы представляете нетекстовый/нецифровой дисплей, это лучше, но я сомневаюсь, что это будет иметь какое-то значение на практике. Вы не разрабатываете игру.

Скорее всего, канал связи между вашим интерфейсом и микросхемой, с которой вы взаимодействуете, имеет ограниченную полосу пропускания и/или приличную задержку, поэтому, если у вас есть объект в одном потоке, который непрерывно считывает данные с чипа и испускает новый значения и объект пользовательского интерфейса, потребляющий их, он будет работать отлично, без необходимости таймеров. Вы должны использовать свойства системы связи, чтобы обеспечить правильное время, используя собственные латентности и ограничения полосы пропускания для получения временной базы.

Возвращаясь к самому вопросу: цикл представляет собой цикл C++. Его производительность привязана к тому, что вы делаете в цикле, и к производительности планировщика на платформе, на которой вы запускаете этот код. Ничего общего с Qt.