Supongo que está tratando de implementar la recopilación de estadísticas de tiempo de ejecución, por ejemplo, cuántos bytes envió, cuánto tiempo ha estado ejecutándose y cuántas veces el usuario ha activado una función en particular.
Normalmente, para compilar estadísticas de tiempo de ejecución como estas de una variedad de fuentes (como subprocesos de trabajo), haría que cada fuente (subproceso) incrementara sus propios contadores locales de los datos más fundamentales pero no funciona cualquier matemática larga o análisis sobre esa información aún.
Luego, de vuelta en el hilo principal (o donde quiera que se analicen estas estadísticas &), envío un mensaje de tipo RequestProgress
a cada uno de los hilos del trabajador.En respuesta, los hilos de trabajo recopilarán todos los datos fundamentales y quizás realicen algunos análisis simples. Estos datos, junto con los resultados del análisis básico, se envían nuevamente a la secuencia solicitante (principal) en un mensaje ProgressReport
. El hilo principal luego agrega todos estos datos, hace análisis adicionales (quizás costosos), formateando y mostrando al usuario o registrando.
El hilo principal envía este mensaje RequestProgress
ya sea a petición del usuario (como cuando presionan la tecla S
), o en un intervalo de tiempo. Si lo que busco es un intervalo cronometrado, normalmente implementaré otro hilo nuevo de "latido". Todo lo que hace este hilo es Sleep()
durante un tiempo específico, luego envía un mensaje Heartbeat
al hilo principal. El hilo principal a su vez actúa sobre este mensaje Heartbeat
enviando RequestProgress
mensajes a cada hilo de trabajador de donde se recopilan las estadísticas.
El acto de recopilar estadísticas parece que debería ser bastante sencillo. Entonces, ¿por qué un mecanismo tan complejo? La respuesta es doble.
En primer lugar, los subprocesos de trabajo tienen un trabajo que hacer, y las estadísticas de uso de cómputo no lo son. Tratar de refactorizar estos hilos para asumir una segunda responsabilidad ortográfica para su propósito principal es un poco como intentar meter una clavija cuadrada en un agujero redondo. No fueron creados para hacer eso, por lo que el código se resistirá a ser escrito.
En segundo lugar, el cálculo de las estadísticas de tiempo de ejecución puede ser costoso si intenta hacer demasiado, con demasiada frecuencia. Supongamos, por ejemplo, que tiene un hilo de trabajo que envía datos de multidifusión en la red y desea recopilar datos de rendimiento. Cuántos bytes, durante cuánto tiempo un período de tiempo y un promedio de cuántos bytes por segundo. Puede hacer que el hilo de trabajo calcule todo esto sobre la marcha, pero es mucho trabajo y el tiempo de CPU lo emplea mejor el hilo de trabajo haciendo lo que se supone que debe hacer: enviar datos de multidifusión. Si, en cambio, simplemente incrementó un contador de cuántos bytes ha enviado cada vez que envía un mensaje, el recuento tiene un impacto mínimo en el rendimiento del hilo. Luego, en respuesta al mensaje de vez en cuando RequestProgress
se puede averiguar los tiempos de arranque y parada &, y enviar sólo que a lo largo de dejar que el hilo principal haga todo el Divison etc.
habría gprof apoyarse? -pg en compilador gcc? – pyCthon
Sí, eso es una cosa que tenemos. Aunque mi problema sería para un programa que se está ejecutando durante mucho tiempo (un servicio), entonces las estadísticas deberían estar accesibles en tiempo de ejecución :-) – Gui13
Lástima que no se pudo agregar otra etiqueta, "incrustada". –