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.