Ciao ho un programma abbastanza complesso che sta facendo calcoli in un ciclo abbastanza grande. Voglio registrare alcune statistiche di base sulla corsa per essere in grado di analizzare le sue prestazioni nel tempo e il numero di loop. Per ora sto emettendo un insieme di numeri, circa 5 o 6, ogni ciclo.
Il problema è che il numero di cicli è abbastanza grande, quindi i file di registro sono grandi. Anche mettere 10 ^ 6 punti di misurazione su una trama è un po 'inutile.
Ho pensato di "filtrare" i risultati, ad esempio stampando ogni 1kthth loop ma perderei alcuni punti di interesse. Inoltre, non riesco a registrare solo POI, perché perderei la traccia dei progressi generali.
Ho deciso di passare a una registrazione basata su eventi. In primo luogo, gli eventi che ho in mente sono la combinazione delle due cose summenzionate: miglioramento della soluzione corrente e alcuni progressi sui loop.
L'implementazione che ho in mente è scrivere un semplice StatLogger
che sarebbe responsabile per l'output dei dati nel flusso di log. Il programma principale emetterebbe appena un metodo log()
ogni volta che si verifica un evento. Gli eventi possono verificarsi simultaneamente e non ha senso registrare lo stato due volte, quindi la classe sarebbe responsabile di non emettere due volte le statistiche.
Le mie domande sono:
- È un approccio o modello valido o comune?
- È meglio passare un gestore all'oggetto numero cruncher, in modo che il logger possa ottenere tutte le statistiche interessanti come
StatLogger::log(const RunEnviroment *this)
, oppure è meglio creare un'altra struttura per contenere tutte le statistiche interessanti e creare un metodoStatLogger::log(const Stats& stats)
. - Se il mio approccio è sbagliato, quali sono le soluzioni più comuni in casi simili?