Tengo una aplicación, donde debo contar el tiempo de ejecución de parte de la función C ++ y la función ASM. En realidad tengo un problema, las veces que obtengo son raras - 0 o alrededor de 15600. O ocurre con más frecuencia. Y a veces, después de la ejecución, los tiempos se ven bien y los valores son diferentes de 0 y ~ 15600. ¿Alguien sabe por qué ocurre? Y como arreglarlo ? Fragmento de contar el tiempo para ejecutar mi aplicación para C ++:

auto start = chrono::system_clock::now();
for (int i = 0; i < nThreads; i++)
    xThread[i]->Start(i);
for (int i = 0; i < nThreads; i++)
    xThread[i]->Join();
auto elapsed = chrono::system_clock::now() - start;
long long milliseconds = chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
cppTimer = milliseconds;
2
Krzysztof Królikowski 8 feb. 2015 a las 21:08

2 respuestas

La mejor respuesta

Lo que está viendo allí es la resolución de su temporizador. Aparentemente, chrono::system_clock marca cada 1/64 de segundo, o 15,625 microsegundos, en su sistema.

Como está en C ++ / CLI y tiene la biblioteca .Net disponible, cambiaría a usar Stopwatch clase. Por lo general, tendrá una resolución mucho más alta que 1/64 de segundo.

2
David Yaw 8 feb. 2015 a las 18:40

Me parece bien. Excepto para enviarlo a std::chrono::microseconds y nombrarlo milliseconds.

El fragmento que he usado durante muchos meses es:

class benchmark {

private:
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::milliseconds milliseconds;

    clock::time_point start;

public:
    benchmark(bool startCounting = true) {
        if(startCounting)
            start = clock::now();
    }

    void reset() {
        start = clock::now();
    }

    // in milliseconds
    double elapsed() {
        milliseconds ms = std::chrono::duration_cast<milliseconds>(clock::now() - start);
        double elapsed_secs = ms.count() / 1000.0;
        return elapsed_secs;
    }
};



// usage
benchmark b;
...
cout << "took " << b.elapsed() << " ms" << endl;
0
tofi9 8 feb. 2015 a las 18:32