2012-06-13 17 views
15

Necesito ayuda con respecto al perfil del código existente en términos de tiempo de ejecución. La intención es acelerarlo.Creación de perfiles de un proyecto de C++ en términos de tiempo de ejecución

Me han dado un código que se trabajó en operaciones anteriores. Está completamente escrito en C++ con conceptos OO. Hay una interfaz basada en GUI, y la selección de una determinada opción ejecuta el tipo de código seleccionado. (Hay alrededor de 11 clases como parte del proyecto).

Quiero ser capaz de presionar una opción de interfaz gráfica de usuario y dejar correr el código y generar un mapa de recursos como:

Functions of Class 1 = 20% of execution time 
Functions of Class 2 = 60% of execution time 
Functions of Class 3 = 10% of execution time 
Functions of Class 4 = 10% of execution time 

De esa manera, sé qué clase está ocupando la mayor parte del tiempo y luego saber qué para trabajar y mejorar Sin embargo, no tengo idea de cómo hacer esto. Solo tengo conocimientos básicos de C++.

he leído este post: find c++ execution time, sin embargo, ya que el programa no es de serie. Una clase llama a otra, y eso llama a otra, no sé cómo se podrían implementar las marcas/reloj del sistema.

leí de programa como Valgrind, Zoom, etc. perfiles del hombre pobre, pero tienen ni idea de honestidad en la integración con el código. ¿Hay un método tan simple?

También leí este método: How can I profile C++ code running in Linux?, sin embargo no veo cómo podría conseguir información de patillas en punta como a la información basada en la clase (Clase 1, Clase 2, etc.)

Podría alguien por favor avise para una novato?

+0

Usaría oprofile, que puede perfilar la ejecución de su programa sin tener que instrumentar su código con ganchos de perfiles http://oprofile.sourceforge.net/doc/overview.html#getting-started – TJD

Respuesta

16

Valgrind (subtool callgrind) es bastante simple de usar. Solo necesita asegurarse de que se compila/vincula suficiente información de depuración en su programa para que callgrind pueda encontrar los nombres de las diversas funciones que están siendo llamadas. Entonces, en lugar de llamar a su programa directamente, pasarlo (y sus argumentos) como parámetros para valgrind, como:

valgrind --tool=callgrind --trace-children=yes <myprogram> <myprogram_args> 

(--trace-niños es allí en caso de que su verdadera ejecutable se esconde detrás de alguna capa o capas de scripts de envoltura)

Tenga en cuenta que el programa se ejecutará mucho más lentamente (como 100 veces más lento), porque se está trazando cada punto de entrada de una sola función. Existen

Diversas herramientas para explorar la producción de Callgrind, especialmente kcachegrind/qcachegrid.

Como alternativa, puede medir las marcas del reloj del sistema para algunas funciones de alto nivel (para ver "el tiempo empleado por la función X y todo lo que hay debajo") y avanzar a través de su código cuando encuentre zonas activas.

Algo como esto (conceptualmente, debe organizarse adecuadamente en encabezados/fuentes):

struct FunctionTimer { 
    FunctionTimer(char const * name) : mName(name), mStartTime(clock()) { } 
    ~FunctionTimer() { mFunctionTimes[mName] += clock() - mStartTime; } 

    static void report() 
    { 
    ... iterate through mFunctionTimes, printing out 
    the names and accumulated ticks ... 
    } 

    std::string mName; 
    clock_t mStartTime; 

    static std::map<std::string, clock_t> mFunctionTimes; 
}; 

... 

void myfunc() 
{ 
    FunctionTimer ft("myfunc"); 
    ... code of myfunc ... 
} 

... 

int main(int argc, char* argv[]) 
{ 
    ... do stuff ... 
    FunctionTimer::report(); 
} 
+0

Gracias Scott, el enfoque alternativo parece como algo que puedo descifrar. Lamentablemente no Valgrind. Voy a intentarlo ... – c0d3rz

2

Una solución es fea para iniciar y detener temporizadores alrededor de cada función de interés, añadiendo el tiempo para alguna variable global después de cada llamada. Luego, al final de la página principal, solo compara las variables para calcular el porcentaje de tiempo.

Esto, sin embargo, podría llegar realmente grave, sobre todo si hay un montón de funciones. Si está familiarizado con un sabor de C++ orientado a los aspectos, podría usarlo temporalmente, porque un aspecto le permitiría poner más fácilmente ese código repetitivo en todas sus funciones.

Cuestiones relacionadas