Информация об изменениях

Сообщение Re[2]: Пример использования шаблонов для оптимизации от 23.02.2015 12:07

Изменено 23.02.2015 14:49 chaotic-good

Z>Погугли про partial evaluation. Собственно hello world для partial evaluation — это обычно рекурсивный алгоритм возведения в константную степень. Степень константа, так что все ветвления и рекурсия раскрываются и это дает ускорение в несколько раз.
Погугли constant folding и constant propagation. Функция возводящая в степень будет оптимизирована компилятором. Что-то такое:
int pow(int x, int y) {
    for (int i = 0; i < y; i++) {
        x *= x;
    }
}
pow(var, 3);

компилятор соптимизирует в две инструкции mul. Цикл будет развернут, так как значение y известно на этапе компиляции (без всяких шаблонов).

Z>Если брать константные выражения не только примитивных типов, то следующий пример: алгоритмы какой-нить интерпретации по константной программе для интерпретатора. Например интерпретация символьного арифметического выражения по константному выражению.

Рабочий пример? Это очень сложно сделать на шаблонах, я думаю не очень и нужно.
Re[2]: Пример использования шаблонов для оптимизации
Z>Погугли про partial evaluation. Собственно hello world для partial evaluation — это обычно рекурсивный алгоритм возведения в константную степень. Степень константа, так что все ветвления и рекурсия раскрываются и это дает ускорение в несколько раз.
Погугли constant folding и constant propagation. Функция возводящая в степень будет оптимизирована компилятором. Что-то такое:
int pow(int x, int y) {
    for (int i = 0; i < y; i++) {
        x *= x;
    }
}
pow(var, 3);

компилятор соптимизирует в две инструкции mul. Цикл будет развернут, так как значение y известно на этапе компиляции (без всяких шаблонов).

Z>Если брать константные выражения не только примитивных типов, то следующий пример: алгоритмы какой-нить интерпретации по константной программе для интерпретатора. Например интерпретация символьного арифметического выражения по константному выражению.


Рабочий пример? Это очень сложно сделать на шаблонах, я думаю не очень и нужно.

Мой поинт в том, что многие программисты просто недооценивают возможности компилятора и переусложняют код из-за этого, пытаясь оптимизировать раньше времени то, что компилятор может соптимизировать без них. Хороший пример это т.н. статический полиморфизм. "Эксперты" любят писать сложный код с CRTP, хотя если конкретный тип объекта может быть выведен статически, компилятор может девиртуализировать вызовы и получится тот же самый результат — статический вызов, но только без использования сложных шаблонов (a-la CRTP) и кучи кода в хедерах. Я просто поспорил кое с кем о том, что использование шаблонов "для скорости" это в 99% случаев ошибка (если это не класс-контейнер). Пока что местные программисты не смогли меня убедить в обратном