std :: function vs template
Graças ao C ++ 11, recebemos ostd::function
família de wrappers functor. Infelizmente, continuo ouvindo apenas coisas ruins sobre essas novas adições. O mais popular é que eles são terrivelmente lentos. Eu testei e eles realmente sugam em comparação com modelos.
#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 ms vs 1241 ms. Presumo que seja porque os modelos podem ser bem alinhados, enquantofunction
s cobrir os internos através de chamadas virtuais.
Obviamente, os modelos têm seus problemas quando os vejo:
eles têm que ser fornecidos como cabeçalhos, o que não é algo que você não deseje fazer ao liberar sua biblioteca como um código fechado,eles podem tornar o tempo de compilação muito mais longo a menos queextern template
como política é introduzida,não há (pelo menos conhecido para mim) uma maneira limpa de representar requisitos (conceitos, alguém?) de um modelo, barra um comentário descrevendo que tipo de functor é esperado.Posso assim supor quefunction
s pode ser usado comode fato padrão de passagem de functores, e em locais onde o alto desempenho é esperado modelos devem ser usados?
Editar:
Meu compilador é o Visual Studio 2012sem CTP.