2011-12-21 18 views
5

Deseo saber la cantidad de tiempo necesario para la ejecución de un programa bajo Linux en microsegundos (o mejor precisión). Actualmente estoy usando el comando time, pero me da la precisión máxima de milisegundos. ¿Hay alguna forma de ajustar el comando time para dar una mayor precisión o hay algún otro comando para el mismo?linux time command microsegundos o mejor precisión

Respuesta

8

Su pregunta no tiene sentido: no obtendrá mediciones repetidas ni siquiera en milisegundos si informa el tiempo.

Agregar más dígitos solo agregará ruido. También podría extraer los dígitos adicionales del /dev/random.

+0

No entiendo su punto. Dije que quiero una precisión mejor que milisegundos, lo cual no es imposible en los procesadores de hoy en día, donde incluso podemos llegar a la precisión de nanosegundos. ¿Cómo agregar más dígitos agrega más ruido? –

+5

@Guidance Porque el código que se ejecuta en un sistema operativo que no es en tiempo real no tiene una ejecución determinística. Todo lo que se necesita es que el sistema operativo procese algunos paquetes IP, u otro proceso arbitario para ejecutar, o un crnie despertando para verificar si debe hacer algo, o el sistema de archivos decide escribir páginas sucias, etc. y el proceso que El cronometraje se suspende durante una (pequeña cantidad de) tiempo y los tiempos están desactivados. Las temporizaciones incorporadas de un SO, como el tiempo de CPU (a diferencia del reloj de pared), generalmente también se cuentan en timeslices que tienen una resolución determinada (a menudo 1 tick del kernel, 1 milisegundo o más) – nos

+0

Pruebas rápidas con 'time/bin/sleep 0.006' parece indicar que el ruido es inferior a 1 milisegundo. Entonces, aunque tales mediciones son definitivamente peligrosas, la solicitud de Guanidene no tiene sentido en sí misma. –

0

Vea si current_kernel_time() es útil para usted en su requisito. Lo he usado y encontré útil ya que da granularidad al nivel de nanosegundos. Más detalles son here.

4

Estoy de acuerdo con Employed Russian's answer. No tiene mucho sentido querer precisión de microsegundo para tales medidas. Entonces cualquier dígito adicional que tengas no tiene sentido (y es esencialmente aleatorio).

Si tiene el código fuente de la aplicación para medir, puede usar las funciones clock o clock_gettime, pero no espere más de una docena de microsegundos de precisión. También está la instrucción de la máquina RDTSC.

Lea el linux clock howto.

Y no olvide que el tiempo de ejecución es desde el punto de vista de la aplicación, no determinístico y no reproducible (piense en cambios de contexto, fallas en la memoria caché, interrupciones, etc. pasando en un tiempo aleatorio).

Si desea medir el rendimiento de un programa completo, hágalo funcionar durante al menos varios segundos, mida el tiempo varias veces (por ejemplo 8) y tome el promedio (quizás dejando caer el mejor & peor sincronización).

Si se desea medir el tiempo para determinadas funciones, aprender a profile su aplicación (gprof, oprofile, etc, etc ...) Véase también this question

No se olvide de leer time(7)

Sé consciente de que en el actual (computadora portátil, computadora de escritorio, servidor) out-of-orderpipelinedsuperscalar procesadores con CPU caches complejos y TLB y branch predictors, el tiempo de ejecución de un pequeño ciclo o secuencia de instrucciones de la máquina i s no reproducible (el recuento de nanosegundos variará de una carrera a la siguiente). Y el sistema operativo también agrega aleatoriedad (scheduling, context switches, interrupts, page cache, copy-on-write, demand-paging ...) por lo que no tiene ningún sentido medir la ejecución de algún comando con más de un milisegundo, o quizás 100μs si tiene suerte- de precisión. Debe comparar su comando varias veces.

Para obtener medidas significativas, debe cambiar la aplicación de referencia para ejecutarse en más de unos pocos segundos (tal vez agregando algún bucle en main, o ejecute con un conjunto de datos más grande ...), y repita el comando de referencia una docena veces. Eso toma la media (o la peor, o la mejor, dependiendo de lo que busque) de las medidas.

Si el sistema time(1) no es suficiente, puede hacer su propia instalación de medición; ver también getrusage(2); Soy escéptico sobre que obtengas medidas más precisas.

cierto en mis i3770K reciente de GNU/Linux (kernel 4.2, Debian/Sid/x86-64) computadora de escritorio, "sistema" como -calls time(2) o clock_gettime(2) carreras en unos 3 o 4 nanosegundos (gracias a que evitan la vdso(7) carga de un syscall real ...) por lo que podría usarlos dentro de su programa con bastante frecuencia.

2

Use gettimeofday - da exactitud en microsegundos

Cuestiones relacionadas