Estoy tratando de capturar el tiempo que tarda mi algoritmo en completarse en C ++. ¿Qué estoy haciendo mal?

nadie ha respondido la pregunta final … “¿por qué tengo malos tiempos de reloj?”

Los relojes en PC son una pesadilla completa,

Para empezar, el reloj estándar de PC en tiempo real tiene una precisión de 1 milisegundo como máximo, y ni siquiera puede garantizarlo, esto puede ocasionar disparidades extrañas, por ejemplo, cronometrar códigos muy rápidos y obtener muchos ceros y ocasionalmente 1 ms.

en segundo lugar, no hay certeza de que cada núcleo del procesador estará sincronizado, por lo que si tiene la suerte de obtener un código que compara los resultados en dos subprocesos diferentes, incluso puede hacer que el tiempo aparentemente retroceda.

Además, el valor devuelto por el reloj aparentemente se limita al tiempo empleado en su código, por lo que si otro proceso intervino por un tiempo, obtendrá una respuesta más baja.

Finalmente, almacenar el tiempo en un flotador es solo pedir problemas, simplemente no es lo suficientemente preciso. Tanvir sugirió esto reescribiendo su código para usar dobles, pero no explicó por qué. Tenga en cuenta, en primer lugar, que dividirá los relojes por segundo. Esto depende de la implementación, pero supongamos que es un millón. El valor del reloj devuelto después de una hora sería de 3.600 millones, que ya está perdiendo precisión si se almacena en flotante. No creo que nadie use ciclos de reloj de CPU reales para esto, pero si lo hicieran, entonces la mayoría de las PC habrían perdido mucha precisión después de muy poco tiempo si el valor se hubiera almacenado en un flotante.

Idealmente, debe mantener los valores en su tipo nativo durante el mayor tiempo posible, ya que la diferencia entre dos valores del mismo tipo siempre será lo suficientemente pequeña como para almacenar en ese tipo. La división por relojes por segundo conservará la mayor precisión si convierte los valores en dobles justo antes de la división.

En Windows, si su sincronización no necesita ser muy precisa, haga lo siguiente:

DWORD antiguo = GetTickCount ();
para (int k = 0; k <1000; ++ k)
{
inserta tu algo
}
printf (“Tiempo necesario% d \ n”, (GetTickCount () – antiguo) / 1000);

La razón por la que puse tu algo en un bucle es que esto aumenta la precisión. A veces su algo llevará más tiempo, porque otros hilos se están ejecutando en su dispositivo. Al ejecutar su código muchas veces, obtenemos un buen promedio.

Si su código es muy rápido, la sobrecarga del bucle anterior se vuelve significativa. Mejor aplique un poco de desenrollamiento de bucle. Escribe por ejemplo:

para (int k = 0; k <100; ++ k)
{
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
inserta tu algo
}

Ejecute su algoritmo en un bucle, de 1000 a un millón de veces. Eso hará que el algoritmo tenga un tiempo de ejecución lo suficientemente grande como para ser medible.