Я делаю проект с графическим интерфейсом, используя LVGL, и открываю монитор LVGL, чтобы увидеть, сколько процессора используется.
Но использование ЦП всегда составляет 99%, что замедляет реакцию графического интерфейса, даже если есть только одна кнопка и две метки. Функция рисования на главном экране занимает до 700 мс, чтобы заполнить массив и отобразить на ЖК-дисплее.
Использование ЦП снижается до 50%, когда я устанавливаю флаг оптимизации GCC с нуля на -O3. И функция рисования занимает 100 мс для выполнения. Как это оптимизируется?
он уменьшается до 50%, потому что ваш код вызывается периодически, и, поскольку он заканчивается раньше, ЦП имеет некоторое время простоя.
Вы можете прочитать, какие оптимизации делает GCC и как их включить/отключить здесь: gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Чтобы дать конкретный ответ на ваш вопрос, код был бы необходим. Но я думаю, это немного долго? Может быть, вы могли бы сравнить, какая функция требует больше всего времени, и посмотреть, как GCC оптимизирует эту конкретную функцию или уменьшит количество вызовов этой функции.
Чтобы не использовать максимальную загрузку ЦП, вы должны разработать приложение для использования функций сна/ожидания, специфичных для системы/ОС. Ни один из них не является задачей компилятора.
Компилятору разрешено изменять порядок выполнения программы, оптимизировать переменные и код, если это пойдет на пользу оптимизации, установленной программистом.
Вот вам очень простой пример:
char *cpy(char *s1, const char *s2)
{
char *svd = s1;
while((*s1++ = *s2++));
return svd;
}
Неоптимизированный код:
cpy:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-32], rsi
mov rax, QWORD PTR [rbp-24]
mov QWORD PTR [rbp-8], rax
nop
.L2:
mov rdx, QWORD PTR [rbp-32]
lea rax, [rdx+1]
mov QWORD PTR [rbp-32], rax
mov rax, QWORD PTR [rbp-24]
lea rcx, [rax+1]
mov QWORD PTR [rbp-24], rcx
movzx edx, BYTE PTR [rdx]
mov BYTE PTR [rax], dl
movzx eax, BYTE PTR [rax]
test al, al
jne .L2
mov rax, QWORD PTR [rbp-8]
pop rbp
ret
И оптимизированный код:
cpy:
mov rax, rdi
xor edx, edx
.L2:
movzx ecx, BYTE PTR [rsi+rdx]
mov BYTE PTR [rax+rdx], cl
add rdx, 1
test cl, cl
jne .L2
ret
Сравните сгенерированный ассемблерный код?