2011-05-11 10 views
10

Necesito averiguar qué unidades de traducción deben reestructurarse para mejorar los tiempos de compilación. ¿Cómo puedo obtener el tiempo de compilación, utilizando cmake, para mis unidades de traducción?cmake: estadísticas de compilación

+0

Como siempre pienso 'cmake' solo genera archivos conf para sistemas de construcción nativos (make, nmake, etc.). Entonces, cmake no está involucrado en el proceso de compilación/enlace. Tal vez deberías buscar esas opciones en tu sistema de compilación nativo. – beduin

+0

Bueno, es un caso de uso bastante común. Sin embargo, si sabes cómo hacerlo para la versión estándar de Linux, sería de lo más útil. –

+2

Lamentablemente, no estoy al tanto de las opciones de fabricación para lograr esto. La primera solución que me viene a la mente es modificar 'Makefiles' para invocar' time' para cada comando 'gcc'. – beduin

Respuesta

8

Esperaría reemplazar el compilador (y/o el enlazador) por 'time original-cmd'. El uso normal 'make', diría:

make CC="time gcc" 

El programa de 'tiempo' sería ejecutar el comando e informar sobre el tiempo que tomó. El mecanismo equivalente funcionaría con 'cmake'. Si necesita capturar el comando, así como la hora, puede escribir su propio comando de forma análoga a la hora (lo haría un script de shell) que registre los datos que desea de la manera que desee.

+0

Por lo general 'tiempo' es un comando incorporado. Para usar el modo detallado, debe escribir el comando 'make CC ="/usr/bin/time -v gcc "'. – Orient

+0

No se puede pasar el compilador de esta manera para un archivo make generado por CMake. En general, no funciona. – usr1234567

4

Para ampliar la respuesta anterior, aquí hay una solución concreta que acabo de escribir, es decir, definitivamente funciona en la práctica, no solo en teoría, sino que ha sido utilizada por una sola persona durante aproximadamente tres minutos , entonces probablemente tiene algunas infelicidades.

#!/bin/bash 
{ time clang "[email protected]"; } 2> >(cat <(echo "clang [email protected]") - >> /tmp/results.txt) 

puse las dos líneas anteriores en /tmp/time-clang y luego corrió

chmod +x /tmp/time-clang 
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang 
make 

Puede utilizar -DCMAKE_CXX_COMPILER= para enganchar el compilador de C++ exactamente de la misma manera.

  • yo no uso make -j8 porque yo no quería que los resultados para obtener intercalado de maneras extrañas.

  • Tuve que poner un hashbang explícito #!/bin/bash en mi secuencia de comandos porque el shell predeterminado (dash, ¿no cree?) En Ubuntu 12.04 no estaba contento con esos operadores de redirección.

+0

Esto funciona muy bien para mí, gracias! Sin embargo, estoy intentando (y luchando) sacar solo la salida 'real' de' tiempo', e imprimirlo junto con el comando clang * en una sola línea * a 'results.txt'? –

11

propiedades podrían ser utilizadas para compilador y enlazador invocaciones de tiempo:

Estas propiedades se podría establecer a nivel mundial, por directorio y por objetivo De esta forma, solo puede tener un subconjunto de sus objetivos (por ejemplo, pruebas) para que se vea afectado por esta propiedad. También puede tener diferentes "iniciadores" para cada objetivo que también podrían ser útiles.

Tenga en cuenta que el uso de "tiempo" directamente no es portátil, ya que esta utilidad no está disponible en todas las plataformas compatibles con CMake. Sin embargo, CMake proporciona funcionalidad de "tiempo" en su command-line tool mode. Por ejemplo:

salida
# Set global property (all targets are impacted) 
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 
# Set property for my_target only 
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 

Ejemplo CMake:

[ 65%] Built target my_target 
[ 67%] Linking C executable my_target 
Elapsed time: 0 s. (time), 0.000672 s. (clock) 

Nota, que a partir de CMake 3.4 sólo generadores Makefile y Ninja apoyar este propiedades.

También tenga en cuenta que a partir de CMake 3.4 cmake -E time tiene problemas con los espacios dentro de los argumentos.Por ejemplo:

cmake -E time cmake "-GUnix Makefiles" 

se interpretará como:

cmake -E time cmake "-GUnix" "Makefiles" 

presenté patch que soluciona este problema.

+0

La respuesta aceptada no funcionó para mí, pero esta sí. – fpnick

+0

Esto tiene otro problema: '$ {CMAKE_COMMAND}' tiene espacios en las ventanas y no funcionará como se sugiere – Pavel

+0

@Pavel puede agregar cotizaciones: 'set_property (TARGET my_target PROPERTY RULE_LAUNCH_COMPILE" \ "$ {CMAKE_COMMAND} \" -E hora ")' – 865719

Cuestiones relacionadas