Improve stat reporting

This commit is contained in:
Rodrigo Arias 2023-02-17 17:36:01 +01:00 committed by Rodrigo Arias Mallo
parent b9cc81fc52
commit 8310127e78
4 changed files with 55 additions and 18 deletions

View File

@ -33,7 +33,7 @@ vaerr(const char *func, const char *errstr, va_list ap)
char last = errstr[len - 1]; char last = errstr[len - 1];
if (last == ':') if (last == ':')
fprintf(stderr, " %s\n", strerror(errno)); fprintf(stderr, " %s\n", strerror(errno));
else if (last != '\n') else if (last != '\n' && last != '\r')
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
} }

View File

@ -51,7 +51,7 @@ emu_init(struct emu *emu, int argc, char *argv[])
return -1; return -1;
} }
emu_stat_init(&emu->stat, 0.5); emu_stat_init(&emu->stat);
model_init(&emu->model); model_init(&emu->model);
@ -167,7 +167,7 @@ emu_step(struct emu *emu)
int int
emu_finish(struct emu *emu) emu_finish(struct emu *emu)
{ {
emu_stat_report(&emu->stat, &emu->player); emu_stat_report(&emu->stat, &emu->player, 1);
if (model_finish(&emu->model, emu) != 0) { if (model_finish(&emu->model, emu) != 0) {
err("model_finish failed"); err("model_finish failed");

View File

@ -17,18 +17,20 @@ get_time(void)
} }
void void
emu_stat_init(struct emu_stat *stat, double period_seconds) emu_stat_init(struct emu_stat *stat)
{ {
memset(stat, 0, sizeof(struct emu_stat)); memset(stat, 0, sizeof(struct emu_stat));
stat->period = period_seconds;
double t = get_time(); double t = get_time();
stat->last_time = t; stat->last_time = t;
stat->reported_time = t;
stat->first_time = t; stat->first_time = t;
stat->maxcalls = 100;
stat->period = 0.2;
} }
void void
emu_stat_report(struct emu_stat *stat, struct player *player) emu_stat_report(struct emu_stat *stat, struct player *player, int last)
{ {
double progress = player_progress(player); double progress = player_progress(player);
int64_t nprocessed = player_nprocessed(player); int64_t nprocessed = player_nprocessed(player);
@ -38,27 +40,58 @@ emu_stat_report(struct emu_stat *stat, struct player *player)
double time_total = time_elapsed / progress; double time_total = time_elapsed / progress;
double time_left = time_total - time_elapsed; double time_left = time_total - time_elapsed;
int tmin = (int) (time_left / 60.0);
int tsec = (int) ((time_left / 60.0 - tmin) * 60.0);
// int64_t delta_nprocessed = nprocessed - stat->last_nprocessed;
// double time_delta = time_now - stat->reported_time;
// double speed = 0.0;
// if (time_delta > 0.0)
// speed = (double) delta_nprocessed / time_delta;
/* Compute average speed since the beginning */ /* Compute average speed since the beginning */
double speed = 0.0; double avgspeed = 0.0;
if (time_elapsed > 0.0) if (time_elapsed > 0.0)
speed = (double) nprocessed / time_elapsed; avgspeed = (double) nprocessed / time_elapsed;
verr(NULL, "%5.1f%% done at %.0f kev/s (%.1f s left)", verr(NULL, "ovniemu: %5.1f%% done at %.0f kev/s (%d min %d s left) \r",
progress * 100.0, progress * 100.0,
speed * 1e-3, avgspeed * 1e-3,
time_left); tmin, tsec);
stat->last_time = time_now; if (last)
fprintf(stderr, "\n");
stat->reported_time = time_now;
stat->last_nprocessed = nprocessed;
} }
void void
emu_stat_update(struct emu_stat *stat, struct player *player) emu_stat_update(struct emu_stat *stat, struct player *player)
{ {
double t = get_time(); stat->ncalls++;
/* Not yet */ /* Don't do anything until we arrive at a minimum number of calls */
if (t - stat->last_time < stat->period) if (stat->ncalls < stat->maxcalls)
return; return;
emu_stat_report(stat, player); stat->ncalls = 0;
double t = get_time();
//double dt = t - stat->last_time;
//if (dt > 300.0e-6) {
// struct emu_ev *ev = player_ev(player);
// struct stream *stream = player_stream(player);
// err("event mcv=%s took %.3f us in %s",
// ev->mcv, stream->relpath,
// dt * 1e6);
//}
stat->last_time = t;
/* Not yet */
if (stat->last_time - stat->reported_time < stat->period)
return;
emu_stat_report(stat, player, 0);
} }

View File

@ -11,11 +11,15 @@ struct emu_stat {
double in_progress; double in_progress;
double period; double period;
double last_time; double last_time;
double reported_time;
double first_time; double first_time;
int64_t last_nprocessed;
int64_t ncalls;
int64_t maxcalls;
}; };
void emu_stat_init(struct emu_stat *stat, double period_seconds); void emu_stat_init(struct emu_stat *stat);
void emu_stat_update(struct emu_stat *stat, struct player *player); void emu_stat_update(struct emu_stat *stat, struct player *player);
void emu_stat_report(struct emu_stat *stat, struct player *player); void emu_stat_report(struct emu_stat *stat, struct player *player, int last);
#endif /* EMU_STAT_H */ #endif /* EMU_STAT_H */