Quiero saber el tiempo de ejecución de mi función escrita en C++ en Linux. Encontré muchas publicaciones al respecto. Probé todos los métodos mencionados en este enlace Métodos de temporizador para calcular el tiempo. Los siguientes son los resultados del tiempo de ejecución de mi función:
time() : 0 seconds clock() : 0.01 seconds gettimeofday() : 0.002869 seconds rdtsc() : 0.00262336 seconds clock_gettime() : 0.00672151 seconds chrono : 0.002841 seconds
Por favor, ayúdenme qué método es confiable en sus lecturas ya que todos los resultados difieren en sus lecturas. Leí que su sistema operativo está cambiando entre diferentes tareas, por lo que no se puede esperar que las lecturas sean muy precisas. ¿Hay alguna manera de que pueda calcular el tiempo que la CPU dedica a mi función? Escuché sobre el uso de la herramienta de creación de perfiles, pero aún no he encontrado ningún ejemplo solo para una función. Por favor guíame.
Tiempo de lectura (7) .
Por varias razones (y dependiendo de su hardware real, es decir, su placa base), la hora no es tan precisa como desearía.
Por lo tanto, agregue un bucle que repita su función muchas veces, o cambie su entrada para que se ejecute por más tiempo. Asegúrese de que el tiempo de ejecución del programa total (dado por time(1) ...) sea de al menos un segundo aproximadamente (si es posible, asegúrese de tener al menos medio segundo de tiempo de CPU ).
Para generar perfiles, compile y vincule con g++ -Wall -pg -O1
y luego use gprof(1) (hay formas más sofisticadas de generar perfiles, por ejemplo, oprofile ...).
Ver también esta respuesta a una pregunta muy similar (por la misma Zara ).
Si está haciendo una prueba simple, tratando de averiguar qué implementación es mejor, entonces cualquier método está bien. Por ejemplo:
const int MAX = 10000; // times to execute the function void benchmark0() { auto begin = std::chrono::steady_clock::now(); for (int i = 0; i < MAX; ++i) method0(); auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin); std::cout << "Cost of method0() is " << elapsed .count() << " milliseconds" << std::endl; } void benchmark1() { /* almost the same as benchmark0, but calls method1 */ } int main() { benchmark0(); benchmark0(); benchmark1(); benchmark1(); }
Es posible que haya notado que benchmark0
y benchmark1
se llamaron consecutivamente dos veces: debido a que habrá caché de CPU, E/S..., es posible que desee deshacerse de la ganancia/pérdida de rendimiento debido al almacenamiento en caché, pero mida el tiempo de ejecución puro .
Por supuesto, también puede usar g ++ para perfilar el programa.