Pregunta

Ahora mismo estoy cargando un archivo a continuación, utilizando gettimeofday y el seguimiento del tiempo de CPU con tv_usec

Mis resultados varían, me sale de 250 a 280, pero a veces de 300 o 500 de. Escribí usleep y dormir (0) y (1) sin éxito. El tiempo todavía varía enormemente. Pensé sueño (1) (segundo en Linux, no el sueño ventanas en ms) habría resuelto. ¿Cómo puedo realizar un seguimiento del tiempo de una manera más consistente para la prueba? Tal vez debería esperar hasta que tenga una prueba de datos mucho más grande y más compleja de código antes de iniciar las mediciones?

¿Fue útil?

Solución

La interfaz actualmente recomendado por el tiempo de alta rez en Linux (y POSIX en general) es clock_gettime. Consulte la página de manual.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

Pero lea la página del manual. Tenga en cuenta que es necesario enlazar con -lrt, porque POSIX dice así, supongo. Tal vez para evitar conflictos de símbolos en -lc, por viejos programas que definen su propia clock_gettime? Pero bibliotecas dinámicas utilizan símbolos débiles ...

La mejor función del sueño es nanosleep. No hace perder el tiempo con las señales o cualquier basura como usleep. Se define a dormir solo, y no tiene ningún otro efecto secundario. Y que te dice si se despertó temprano (por ejemplo, de señales), por lo que no necesariamente tiene que llamar a otra función de tiempo.

De todos modos, vas a tener un tiempo difícil probar una repetición de algo que corta que implica una llamada al sistema. Hay una gran cantidad de oportunidades para la variación. p.ej. el planificador puede decidir que algunas otras necesidades de trabajo haciendo (poco probable si el proceso acaba de comenzar, no se habrá agotado su porción de tiempo aún). caché de la CPU (L2 y TLB) son fácilmente posible.

Si usted tiene una máquina multi-núcleo y un solo subproceso punto de referencia para el código que está optimizando, se puede dar prioridad de tiempo real clavado en uno de sus núcleos. Asegúrese de elegir el núcleo que no está manejando interrupciones, o el teclado (y todo lo demás) se bloqueará hasta que se hace. Utilice taskset (para fijar a una CPU) y chrt (para el ajuste en tiempo real Prio). Ver este mail que envié a GMP-devel con este truco: http://gmplib.org/list-archives/gmp- devel / 2008-marzo / 000789.html

Oh, sí, por el momento más precisa, se puede utilizar RDTSC mismo (en x86 / amd64). Si usted no tiene ningún otro llamadas al sistema en lo que estás banqueo, no es una mala idea. Coge un marco de referencia para poner su función dentro. GMP tiene una muy decente. Es tal vez no se preparó para la evaluación comparativa de las funciones que no están en GMP y llama mpn_whatever, sin embargo. No recuerdo, y vale la pena un vistazo.

Otros consejos

¿Estás tratando de medir el tiempo que tarda en cargar un archivo? Por lo general, si usted está probando el rendimiento cierta porción de código que ya es bastante rápido (menos de un segundo), entonces usted tendrá que repetir el mismo código varias veces (digamos mil o un millón), el tiempo de todo el lote, a continuación, dividir el tiempo total por el número de iteraciones.

Una vez dicho esto, no estoy muy seguro de lo que estás usando el sueño () para. Se puede publicar un ejemplo de lo que va a hacer?

Yo recomendaría poner ese código en un bucle. Ejecutarlo más de 1000 o 10000 iteraciones. Hay problemas con esto, si está haciendo sólo unas pocas instrucciones, pero debería ayudar.

Los grandes conjuntos de datos también ayuda, por supuesto.

sueño va a deschedule el hilo de la CPU. No cuenta con precisión el tiempo con precisión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top