У меня есть довольно сложный код на C ++, который используется в системе реального времени и поэтому абсолютно чувствителен к скорости. Он был разработан для Linux, и для его ускорения многие функции были помечены ключевым словом «inline» и помещены в заголовочные файлы для обеспечения возможности встраивания.
Теперь я перенес этот код в Windows (msvc 10.0, Windows 7), и он работает примерно на 30% медленнее. После некоторого профилирования я обнаружил, что проблема в основном в том, что многие функции не встроены. Когда я использую вместо этого «__forceinline», я легко вижу ускорение на 10-20%.
У кого-нибудь есть объяснение этому? Только ли алгоритм в msvc работает гораздо более консервативно? Или я просто сделал что-то не так, например, пропустил опцию конфигурации?
Вам нужно проверить настройки оптимизации MSVC:
Project Properties -> C/C++ -> Optimization
Там есть настройка под названием "Favor size or speed"
что существенно изменяет степень готовности компилятора.
Что такое
inline
?
inline
это ключевое слово, которое сигнализирует компилятору, что определение метода представлено встроенным. Как правило, метод должен быть определен только в одном TU (исходный файл, примерно), и inline
позволяет определить метод в заголовке, который будет включен во многие различные TU, и избежать жалоб компилятора / компоновщика на дубликаты символов. Компоновщик объединит символы соответствующим образом.
Что такое не
inline
?
inline
ни в коем случае не является приказом для компилятора встроить функцию. Исторически он мог использоваться как таковой, но оптимизаторы все лучше и лучше решали, когда (а не) встроить, и inline
«подсказка» в настоящее время малоэффективна.
Как обеспечить встраивание?
Компиляторы обычно предоставляют конкретные ключевые слова / атрибуты, требующие «большего» встраивания. В MSVC, например, __forceinline
будет подсказка сильно (но все же просто подсказка), что метод должен быть встроенным.