Несколько способов оптимизировать бесконечные циклы в программах:
- Преобразовать бесконечные циклы с выходом по break в конечные циклы с постусловием. 4 Для этого тело цикла как бы прокручивается, чтобы оператор break переместился на место while(1), а сам while(1) сомкнулся с оператором do и «коллапсировал». 4
- Размыкнуть цикл. 3 Если внутри цикла есть условный оператор if-else, и принятие решения внутри цикла происходит на каждой итерации, то можно разомкнуть цикл, приняв решение вне цикла. 3 Это позволит исключить инструкцию проверки условия при каждой итерации, если условие не изменяется во время итераций цикла. 3
- Объединить циклы. 13 Если есть два цикла, которые работают с одним набором элементов, их можно объединить для устранения затрат на выполнение дополнительного цикла. 3 Важно, чтобы совпадали диапазоны изменения данных. 3
- Развертывание цикла. 3 Количество инструкций в цикле увеличивается. 3 За одну итерацию выполняется либо несколько инструкций, либо более сложная инструкция, которая может быть разбита компилятором на несколько. 3 В результате увеличивается количество инструкций, которые могут быть исполнены параллельно, а также более интенсивно задействуются регистры процессора, кэш данных и исполнительные устройства. 3
- Расщепление цикла. 3 Цикл разбивают на несколько циклов, при этом все эти циклы имеют одинаковые диапазоны изменения индекса, только содержат разные части тела исходного цикла. 3 Такая оптимизация помогает выполнить цикл на нескольких потоках или на различных ядрах CPU. 3
Результат оптимизации непредсказуем в контексте разных языков программирования, поэтому стоит проверять отдельно на каждом языке. 3