mem_fn
es más pequeño y más rápido que bind
. Pruebe el siguiente programa con su compilador favorito y compare:
- El tamaño del ejecutable resultante y
- El número de segundos reportados como se gasta.
Es posible comparar el rendimiento de bind
frente mem_fn
cambiando el 1 a 0 en la línea #if
.
#include <iostream>
#include <functional>
#include <chrono>
struct Foo
{
void bar() {}
};
int main(int argc, const char * argv[])
{
#if 1
auto bound = std::bind(&Foo::bar, std::placeholders::_1);
#else
auto bound = std::mem_fn(&Foo::bar);
#endif
Foo foo;
auto start = std::chrono::high_resolution_clock::now();
for(size_t i = 0; i < 100000000; ++i)
{
bound(foo);
}
auto end = std::chrono::high_resolution_clock::now();
auto delta = std::chrono::duration_cast< std::chrono::duration<double>>(end - start);
std::cout << "seconds = " << delta.count() << std::endl;
return 0;
}
Los resultados pueden variar, pero en mi sistema actual de la versión mem_fn
del ejecutable es de 220 bytes más pequeña y corre alrededor de dos veces más rápido que la versión bind
.
Y como bonus, mem_fn
no requiere que recuerde añadir std::placeholders::_1
como bind does
(so pena de un error del compilador con plantilla oscura).
Por lo tanto, prefiera mem_fn
cuando pueda.
Lo curioso es que tanto 'bind' como' mem_fn' han llegado al Informe técnico 1 de C++, y se supone que el comité de C++ es bastante estricto. ¿No se dieron cuenta de que estamos duplicando funcionalidades? –