Две техники кодирования, которые я не видел в приведенном выше списке:
Обойти компоновщик, написав код в качестве уникального источника
Хотя отдельная компиляция действительно хороша для времени компиляции, она очень плоха, когда вы говорите об оптимизации. По сути, компилятор не может оптимизировать за пределы модуля компиляции, то есть зарезервированный домен компоновщика.
Но если вы хорошо спроектируете свою программу, вы также можете скомпилировать ее через уникальный общий источник. То есть вместо компиляции unit1.c и unit2.c затем связываются оба объекта, компилируется all.c, который просто #include unit1.c и unit2.c. Таким образом, вы получите выгоду от всех оптимизаций компилятора.
Это очень похоже на написание только заголовочных программ на C ++ (и даже проще на C).
Этот метод достаточно прост, если вы пишете свою программу, чтобы включить ее с самого начала, но вы также должны знать, что она меняет часть семантики C, и вы можете столкнуться с некоторыми проблемами, такими как статические переменные или конфликты макросов. Для большинства программ достаточно легко преодолеть возникающие небольшие проблемы. Также имейте в виду, что компиляция в качестве уникального источника намного медленнее и может занимать огромный объем памяти (обычно это не проблема современных систем).
Используя эту простую технику, я сделал несколько программ, которые написал в десять раз быстрее!
Как и ключевое слово register, этот прием также может скоро устареть. Оптимизация через компоновщик начинает поддерживаться компиляторами gcc: оптимизация времени соединения .
Отдельные атомарные задачи в циклах
Этот более хитрый. Речь идет о взаимодействии между дизайном алгоритма и тем, как оптимизатор управляет кэшем и размещением регистров. Довольно часто программам приходится перебирать некоторую структуру данных и для каждого элемента выполнять определенные действия. Довольно часто выполняемые действия можно разделить на две логически независимые задачи. Если это так, вы можете написать одну и ту же программу с двумя циклами на одной границе, выполняющими ровно одну задачу. В некоторых случаях написание этого способа может быть быстрее, чем уникальный цикл (детали более сложные, но объяснение может состоять в том, что в случае простого задания все переменные могут храниться в регистрах процессора, а в случае более сложного это невозможно, а некоторые регистры должны быть записаны в память и позже считаны, а стоимость выше, чем дополнительное управление потоком).
Будьте осторожны с этим (профильные исполнения, использующие этот трюк или нет), как при использовании регистра, он также может дать меньшие характеристики, чем улучшенные.