Прямое включение шаблона медленнее, чем отдельная реализация - PullRequest
0 голосов
/ 15 марта 2019

У меня есть простой шаблонный заголовок, содержащий 3 шаблонные функции (без объявлений, только определения и помеченные static inline), две из этих функций имеют длину 5000 строк. Эти длинные функции очень просты, но они длинные, потому что они находятся в форме программы stinghtline / без циклов. В моем основном программном файле, где я использую создание экземпляра шаблона, если я включаю файл шаблона напрямую, программа работает примерно в 10 раз медленнее, чем если бы я строил отдельный файл c ++, чтобы включить шаблон и создать его экземпляр, и сделать ссылку на него как статическая библиотека (-fPIC используется). Почему?

Является ли компилятор слишком медленным, кеш инструкций запутался, компилятор неожиданно включил длинные функции, когда не должен, или что-то еще?

Код сильно оптимизирован, компилируется с флагами: -O3 -ffast-math -march=native -std=gnu++11 и GCC 5.5.0 в Mac OS 10.14.3.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Флаги оптимизации не учитывались при компиляции основной программы, возможно, ошибка CMake. При компиляции экземпляра шаблона отдельно в виде библиотеки использовались флаги оптимизации, в результате чего программа работала быстро. Я заставил флаги оптимизации использоваться в основной программе с прямым включением шаблона, и теперь он работает так же быстро.

Ради любопытства: ключевые слова inline и static были безвредны - их удаление не влияло на скорость. На самом деле, несмотря на подсказку, компилятор не вставляет функции, поскольку знает, когда этого не следует делать. Принудительное встраивание с использованием __attribute__((always_inline)) делает компиляцию очень медленной, а также производительность во время выполнения немного замедляется (в 2 раза).

0 голосов
/ 15 марта 2019

Если вы объявляете шаблон функции статичным, разве это не приводит к тому, что одна копия его генерируется на единицу перевода (скомпилированный объектный файл)?Возможно, это приведет к 3 копиям генерируемого метода и да, кешированию проблем.

Решает ли избавление от ключевого слова static проблемы с производительностью?

...