programa - tiempo de ejecucion en nanosegundos c++
¿El tiempo de reloj de la CPU debe ser exactamente el mismo entre las ejecuciones? (3)
Tengo un gran proyecto escrito en C ++. Puede tener algunos problemas de estabilidad (es decir, tiempo de ejecución aleatorio), pero no estoy seguro de ello. Entiendo que el tiempo de ejecución, medido por el tiempo del reloj de pared, puede ser diferente entre las ejecuciones, debido a la multitarea del sistema operativo. Pero no sé, si es normal para un programa estable, tener un tiempo de ejecución variable medido por el tiempo de reloj de la CPU entre ejecuciones con la misma entrada. Traté de usar clock()
desde time.h, y
boost::chrono:::process_user_cpu_clock::now();
Pero en ambos casos veo picos en un gráfico. Te daré un ejemplo de tales gráficos. Aquí el eje Y - tiempo de ejecución, eje X - carreras consecutivas de un mismo programa, en los mismos datos de entrada. Gráfico rojo - hora del reloj de pared, rojo - hora del reloj de la CPU, tomada por el reloj () desde la hora.h
Por supuesto, asumimos que nuestro programa es estable y no tiene ningún comportamiento aleatorio. Entonces, ¿es posible? La plataforma es Windows 7.
Por supuesto, asumimos que nuestro programa es estable y no tiene ningún comportamiento aleatorio. Entonces, ¿es posible?
Si su programa se ejecuta en un escritorio, esta variabilidad es típica, y yo diría que es inevitable. Las interrupciones, la actividad del canal de E / S y Ethernet consumen tiempo de CPU, a menudo con "bloques de tiempo" sorprendentemente grandes (consulte tcp / ip SAR, falta de memoria caché, etc.), la mayoría de los cuales escapan al control de su programa y no a -sincroniza con tus esfuerzos de sincronización.
He visto solo un ejemplo de software que se ejecuta de una manera "estable" que insinúa. Esa computadora era una SBC (computadora de una sola placa), con 1 CPU (no Intel o AMD), toda la memoria RAM estática (así que no tiene RAM dinámica ni actividad de actualización), no tiene Ethernet, pero tiene dos canales de E / S a velocidad fija. y ejecutó un único programa en un sistema op reducido (no Linux, no un SO de escritorio) ... la precisión era como si el comportamiento fuera simple hw logic.
Como líder del equipo, reconocí lo inusual, así que le pregunté si tenía tiempo para adjuntar un analizador lógico y un alcance ... Demostró que ninguna herramienta mostraba ninguna variación en el tiempo, de punta a punta, de mensaje a mensaje. Su lógica de software era, para mí, impresionantemente directa. En ese sistema, si no necesitabas una interrupción, simplemente no la habilitabas.
Una computadora de escritorio es una bestia notablemente diferente ... tantas cosas sucediendo al mismo tiempo, la mayoría de las cuales no pueden ser sofocadas.
Sí. No solo es posible sino inevitable que una computadora de escritorio tenga los tipos de varianza (en tiempo) que está viendo.
Y sin embargo, es posible lograr la estabilidad que ha insinuado, pero no en una computadora de escritorio. Se necesita hardware especial y una codificación cuidadosa.
OP dice que está usando Windows 7, si eso es MSVC, la página de manual dice
La función de reloj indica cuánto tiempo de reloj de pared ha usado el proceso de llamada. Tenga en cuenta que esto no es estrictamente conforme con ISO C99, que especifica el tiempo neto de CPU como el valor de retorno. Para obtener tiempo de CPU, use la función Win32 GetProcessTimes.
Es por eso que el tiempo de ejecución aparente es inconsistente.
Esto es absolutamente normal. Hay muchos efectos que causan esto. De hecho, la repetibilidad de los experimentos de rendimiento es muy difícil de lograr.
Memoria caché
Cualquier rendimiento que involucre memoria depende en gran medida de si se usa o no el caché:
El sistema operativo programa otro hilo en tu núcleo? Incluso si el tiempo de este hilo no cuenta para su reloj de proceso, puede desalojar sus datos de trabajo del caché y su programa se ejecutará más despacio después.
El sistema operativo decide mover su hilo a otro núcleo? La memoria caché local central no contiene sus datos de trabajo. En una aplicación paralela, la asignación de subprocesos a núcleos tiene un gran impacto en el rendimiento.
El sistema operativo decide ejecutar otro hilo de memoria intensa en paralelo (en un núcleo diferente)? Su aplicación tiene menos caché compartido y ancho de banda de memoria disponible.
Hardware
En un sistema reciente, es probable que utilice el modo turbo, que cambia la frecuencia de la CPU en función de muchos parámetros, incluida la temperatura.
Las CPU modernas tienen muchas heurísticas que afectan el rendimiento. Por ejemplo, un predictor de rama adivina qué rama se toma para un salto en función de la "experiencia" pasada. Su rendimiento varía mucho, independientemente de si esa suposición es correcta o no, como se explica en detalle en esta respuesta épica . Hay otros componentes como ese, por ejemplo, precaptores.
Exactitud del reloj
Los relojes tampoco son perfectos. Tienen resolución y precisión limitadas. Pueden derivar con el tiempo o diferir entre núcleos. Como lo indica Weather Pane, el software en la parte superior de los relojes también puede estar equivocado.
Esta es, de lejos, una lista completa, solo algunos ejemplos.