Longpoke, есть только одно ограничение: время. Если у вас нет ресурсов для оптимизации каждого отдельного изменения в коде и вы тратите свое время на выделение регистров, оптимизацию нескольких разливов и что нет, компилятор будет побеждать каждый раз. Вы вносите свои изменения в код, перекомпилируете и измеряете. Повторите при необходимости.
Кроме того, вы можете многое сделать на стороне высокого уровня. Кроме того, проверка полученной сборки может дать IMPRESSION то, что код является дерьмом, но на практике он будет работать быстрее, чем, по вашему мнению, будет быстрее. Пример:
int y = data [i];
// сделать что-то здесь ..
call_function (y, ...);
Компилятор будет читать данные, помещать их в стек (разливать), а затем читать из стека и передавать в качестве аргумента. Звучит дерьмо? На самом деле это может быть очень эффективная компенсация задержки и привести к ускорению времени выполнения.
// оптимизированная версия
call_function (data [i], ...); // все-таки не так оптимизировано ..
Идея с оптимизированной версией заключалась в том, что мы уменьшили давление в регистре и избежали пролива. Но на самом деле «дерьмовая» версия оказалась быстрее!
Просмотр кода сборки, просто просмотр инструкций и заключение: больше инструкций, медленнее, было бы неправильным суждением.
Здесь следует обратить внимание: многие эксперты по сборке думают , что они знают много, но знают очень мало. Правила меняются от архитектуры к следующей тоже. Например, не существует x86-кода «серебряная пуля», который всегда самый быстрый. В эти дни лучше идти по эмпирическим правилам:
- память медленная
- кеш быстрый
- попробуй лучше использовать кэшированный
- как часто ты будешь скучать? у вас есть стратегия компенсации задержки?
- вы можете выполнить 10-100 ALU / FPU / SSE инструкций для одного промаха одного кеша
- важна архитектура приложения ..
- .. но это не помогает, когда проблема не в архитектуре
Кроме того, чрезмерное доверие к компилятору, волшебным образом превращающее плохо продуманный код C / C ++ в «теоретически оптимальный» код, - это заблуждение. Вы должны знать, какой компилятор и цепочка инструментов вы используете, если вы заботитесь о «производительности» на этом низком уровне.
Компиляторы в C / C ++, как правило, не очень хороши в переупорядочении подвыражений, потому что функции имеют побочные эффекты, для начала. Функциональные языки не страдают от этого предостережения, но не соответствуют нынешней экосистеме. Существуют опции компилятора, которые позволяют смягчить правила точности, которые позволяют компилятору / компоновщику / генератору кода изменять порядок операций.
Эта тема немного тупиковая; для большинства это не имеет значения, а все остальное они уже знают, что делают.
Все сводится к следующему: «понимать, что ты делаешь», это немного отличается от знания, что ты делаешь.