uso mi propia versión de la función de Python time_it
. La ventaja de esta función es que repite un cálculo tantas veces como sea necesario para obtener resultados significativos. Si el cálculo es muy rápido, se repetirá muchas veces. Al final, obtienes el tiempo promedio de todas las repeticiones. No utiliza ninguna funcionalidad no estándar:
#include <ctime>
double clock_diff_to_sec(long clock_diff)
{
return double(clock_diff)/CLOCKS_PER_SEC;
}
template<class Proc>
double time_it(Proc proc, int N=1) // returns time in microseconds
{
std::clock_t const start = std::clock();
for(int i = 0; i < N; ++i)
proc();
std::clock_t const end = std::clock();
if(clock_diff_to_sec(end - start) < .2)
return time_it(proc, N * 5);
return clock_diff_to_sec(end - start) * (1e6/N);
}
el siguiente ejemplo se utiliza la función time_it
para medir el desempeño de los diferentes contenedores STL:
void dummy_op(int i)
{
if(i == -1)
std::cout << i << "\n";
}
template<class Container>
void test(Container const & c)
{
std::for_each(c.begin(), c.end(), &dummy_op);
}
template<class OutIt>
void init(OutIt it)
{
for(int i = 0; i < 1000; ++i)
*it = i;
}
int main(int argc, char ** argv)
{
{
std::vector<int> c;
init(std::back_inserter(c));
std::cout << "vector: "
<< time_it(boost::bind(&test<std::vector<int> >, c)) << "\n";
}
{
std::list<int> c;
init(std::back_inserter(c));
std::cout << "list: "
<< time_it(boost::bind(&test<std::list<int> >, c)) << "\n";
}
{
std::deque<int> c;
init(std::back_inserter(c));
std::cout << "deque: "
<< time_it(boost::bind(&test<std::deque<int> >, c)) << "\n";
}
{
std::set<int> c;
init(std::inserter(c, c.begin()));
std::cout << "set: "
<< time_it(boost::bind(&test<std::set<int> >, c)) << "\n";
}
{
std::tr1::unordered_set<int> c;
init(std::inserter(c, c.begin()));
std::cout << "unordered_set: "
<< time_it(boost::bind(&test<std::tr1::unordered_set<int> >, c)) << "\n";
}
}
En caso de que alguien es curioso aquí es la salida I Get (compilado con VS2008 en modo de lanzamiento):
vectorial: 8,7168
lista: 27,776
deque: 91,52
conjunto: 103,04
unordered_set: 29.76
¿El GetTickCount() utiliza QueryPerformanceCounter() debajo de la campana o? – Mithrax
Eso no lo sé. Agregué un enlace a la página GetTickCount() y parece que tiene otras opciones, probablemente mejores, basadas en lo que hay allí. – John
No. GetTickCount() es inexacto. Si quiere un recuento preciso, debe usar QueryPerformanceCounter() (EDITAR: por inexacto quiero decir +/- 10ms) –