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

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

Изменено 24.02.2015 11:08 chaotic-good

CG>>Я не утверждал что кругом нужно лепить динамический полиморфизм.
EP>Ты говорил что статический полиморфизм ведёт к сложному коду. По факту же, код зачастую получается намного проще.

Да, ведет к сложному коду. Как минимум к коду в хедерах, что уже усложняет сам код и процесс разработки. Простые алгоритмы — да, я согласен, становятся проще. Код всяких коллекций тоже выигрывает. Но вот остальное — едва ли. Просто мне часто доводилось видеть код, черезмерно злоупотребляющий шаблонами. Вот такой вот например:

template<class FwdIter>
void reset(FwdIter begin, FwdIter end) {
    std::vector<int> tmp(begin, end);
    std::swap(m_values, tmp);
    ...
}


я однаждый исправил на вот такое вот:
void reset(std::vector<int> newvals) {
    std::swap(newvals, m_values);
}

Ибо в проекте на 400К LOC он всегда использовался с вектором, за исключением одного случая в не критичном к производительности участке кода. Как ты наверное понимаешь, иметь подобные методы в хедерах ради перспективы использовать их с std::list или deque без лишнего копирования — очень сомнительна. Тупой код с конкретным типом стал проще, хочу заметить.

EP>>>Ошибка какого рода? Не добавляет скорости или "производительность в базу упирается"?

CG>>Ложное целеполагание. Некоторые считают что с помощью шаблонов можно получить более быстрый код, но по факту, никто ведь не сравнивает обычно
EP>Выше привели сравнение — даже в простом случае код на шаблонах оказался быстрее чем constexpr функция (без форсирования compile-time контекста).

Этот пример? Это все я могу и в матлабе посчитать, вставить в виде коснтанты в код и в комментарии описать алгоритм получения. В общем, не самый практичный пример.

EP>Ты как-то слишком ловко от частного "для non-type template parameters, в некоторых частных случаях, аналог без шаблонов даст иногда даст такой же результат, а в общем случае не лучше" переходишь к общему "очень часто компилятор может оптимизировать код без шаблонов не хуже"


В том то и дело что это не частные случаи. Ты можешь использовать шаблон для генерации более быстрого кода тогда, когда на этапе компиляции есть какая-нибудь информация и ты можешь развернуть какой-нибудь цикл или зафиксировать какой-нибудь параметр или избавиться от косвенного вызова через vtable, но то же самое компилятор делает постоянно и без твоей помощи, когда у него эта информация есть. Я когда на C# программировал — циклы вручную разворачивал иногда, так как там JIT компилятор тупой был, а для плюсов полно хороших оптимизирующих компиляторов, поэтому заниматься разворачиванием циклов (пусть и неявным) заниматься нет смысла практически никогда.
Re[6]: Пример использования шаблонов для оптимизации
CG>>Я не утверждал что кругом нужно лепить динамический полиморфизм.
EP>Ты говорил что статический полиморфизм ведёт к сложному коду. По факту же, код зачастую получается намного проще.

Да, ведет к сложному коду. Как минимум к коду в хедерах, что уже усложняет сам код и процесс разработки. Простые алгоритмы — да, я согласен, становятся проще. Код всяких коллекций тоже выигрывает. Но вот остальное — едва ли. Просто мне часто доводилось видеть код, черезмерно злоупотребляющий шаблонами. Вот такой вот например:

template<class FwdIter>
class Foo {
....
void reset(FwdIter begin, FwdIter end) {
    std::vector<int> tmp(begin, end);
    std::swap(m_values, tmp);
    ...
}


я однаждый исправил на вот такое вот:
void Foo::reset(std::vector<int> newvals) {
    std::swap(newvals, m_values);
}

Ибо в проекте на 400К LOC он всегда использовался с вектором, за исключением одного случая в не критичном к производительности участке кода. Как ты наверное понимаешь, иметь подобные методы в хедерах ради перспективы использовать их с std::list или deque без лишнего копирования — очень сомнительна. Тупой код с конкретным типом стал проще, хочу заметить.

EP>>>Ошибка какого рода? Не добавляет скорости или "производительность в базу упирается"?

CG>>Ложное целеполагание. Некоторые считают что с помощью шаблонов можно получить более быстрый код, но по факту, никто ведь не сравнивает обычно
EP>Выше привели сравнение — даже в простом случае код на шаблонах оказался быстрее чем constexpr функция (без форсирования compile-time контекста).

Этот пример? Это все я могу и в матлабе посчитать, вставить в виде коснтанты в код и в комментарии описать алгоритм получения. В общем, не самый практичный пример.

EP>Ты как-то слишком ловко от частного "для non-type template parameters, в некоторых частных случаях, аналог без шаблонов даст иногда даст такой же результат, а в общем случае не лучше" переходишь к общему "очень часто компилятор может оптимизировать код без шаблонов не хуже"


В том то и дело что это не частные случаи. Ты можешь использовать шаблон для генерации более быстрого кода тогда, когда на этапе компиляции есть какая-нибудь информация и ты можешь развернуть какой-нибудь цикл или зафиксировать какой-нибудь параметр или избавиться от косвенного вызова через vtable, но то же самое компилятор делает постоянно и без твоей помощи, когда у него эта информация есть. Я когда на C# программировал — циклы вручную разворачивал иногда, так как там JIT компилятор тупой был, а для плюсов полно хороших оптимизирующих компиляторов, поэтому заниматься разворачиванием циклов (пусть и неявным) заниматься нет смысла практически никогда.