std :: function vs template

Благодаря C ++ 11 мы получилиstd::function семья функторов-фантиков. К сожалению, я продолжаю слышать только плохие вещи об этих новых дополнениях. Наиболее популярным является то, что они ужасно медленные. Я проверил это, и они действительно сосут по сравнению с шаблонами.

#include <iostream>
#include <functional>
#include <string>
#include <chrono>

template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }

float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }

int main() {
    using namespace std::chrono;

    const auto tp1 = system_clock::now();
    for (int i = 0; i < 1e8; ++i) {
        calc1([](float arg){ return arg * 0.5f; });
    }
    const auto tp2 = high_resolution_clock::now();

    const auto d = duration_cast<milliseconds>(tp2 - tp1);  
    std::cout << d.count() << std::endl;
    return 0;
}

111 мс против 1241 мс Я предполагаю, что это потому, что шаблоны могут быть красиво встроены, в то время какfunctionПокрытие внутренних органов с помощью виртуальных звонков.

Очевидно, шаблоны имеют свои проблемы, как я их вижу:

они должны быть представлены в виде заголовков, а это не то, что вы, возможно, не захотите делать при выпуске своей библиотеки в виде закрытого кода,они могут значительно увеличить время компиляции, еслиextern templateполитика,не существует (по крайней мере, мне известно) чистого способа представления требований (концепций, кого-либо?) шаблона, за исключением комментария, описывающего, какой тип функтора ожидается.

Могу ли я предположить, чтоfunctionс можно использовать какде-факто стандарт прохождения функторов, а в местах, где ожидается высокая производительность, шаблоны следует использовать?

Редактировать:

Мой компилятор - Visual Studio 2012без CTP.

Ответы на вопрос(7)

Ваш ответ на вопрос