Процессор ARM имеет конвейер команд (кэш). Когда процессор сталкивается с инструкцией ветвления (вызова), он должен очистить конвейер и перезагрузить, тратя, таким образом, некоторое время. Одной из целей оптимизации скорости является уменьшение количества перезагрузок в конвейер команд. Это означает сокращение инструкций ветвления.
Как другие заявили в SO, скомпилируйте ваш код с оптимизацией по скорости и профилю. Я предпочитаю также посмотреть листинг на ассемблере (либо распечатанный из компилятора, либо выведенный в отладчике). Используйте это как основу. Если вы не можете профилировать, вы можете использовать подсчет инструкций по сборке как приблизительную оценку.
Следующим шагом является уменьшение количества веток; или сколько раз берется ветвь. Развертывание циклов помогает уменьшить количество раз, которое берется ветвь. Встраивание помогает уменьшить количество веток. Прежде чем применять эти методы точной настройки, просмотрите дизайн и реализацию кода, чтобы увидеть, можно ли уменьшить количество ветвей. Например, уменьшите количество операторов if, используя булеву арифметику или Karnaugh Maps . Мой фаворит - сокращение требований и устранение кода, который не нужно выполнять.
В реализации кода перемещайте код, который не изменяется, вне циклов for
или while
. Некоторые циклы могут быть сведены к уравнениям (например, замена цикла сложений умножением). Кроме того, уменьшите количество итераций, задав вопрос: «Действительно ли этот цикл действительно должен выполняться много раз»).
Другой метод заключается в оптимизации для Data Oriented Design . Также проверьте эту ссылку .
Просто не забудьте установить предел для оптимизации. Именно здесь вы решаете, что дальнейшая оптимизация не будет приносить прибыли или удовлетворения клиентов. Кроме того, применяйте оптимизацию поэтапно; что позволит вам получить результат, когда ваш менеджер попросит его.