Ich weiß nicht, warum das passiert, und ich kann nicht betonen, testen Sie das Modul gerade jetzt versuchen, solche Fälle zu generieren.
Aber ein Grundsatz, dem ich meine ganze Forschung gefolgt habe, besteht nicht darin, Daten, die ich als Unsinn verstehe, durch etwas zu ersetzen, das vernünftig aussieht. Sie haben grundsätzlich keine Beobachtungen und Sie sollten sie als solche behandeln. Ich würde überhaupt keinen Zahlenwert anhängen, um nicht vorzutäuschen, dass ich Informationen habe, wenn ich es nicht tue.
Dann sind Ihre Statistiken für die nicht fehlenden Punkte sinnvoll und Sie können alle Muster in den fehlenden Beobachtungen separat betrachten.
UPDATE: Mit Blick auf die calc_prec()
Funktion im source code:
/* calc_prec()
*
* calculate the two cpu/memory precentage values
*/
static void calc_prec(char *format_str, struct procstat *prs, struct obstack *mem_pool)
{
float pctcpu = 100.0f * (prs->utime/1e6)/(time(NULL) - prs->start_time);
/* calculate pctcpu - NOTE: This assumes the cpu time is in microsecond units! */
sprintf(prs->pctcpu, "%3.2f", pctcpu);
field_enable(format_str, F_PCTCPU);
/* calculate pctmem */
if (system_memory > 0) {
sprintf(prs->pctmem, "%3.2f", (float) prs->rss/system_memory * 100.f);
field_enable(format_str, F_PCTMEM);
}
}
Zuerst IMHO, wäre es besser, teilen nur durch 1e4 und nicht durch 100.0f nach der Teilung multipliziert wird. Zweitens ist es möglich (wenn sofort nach dem Prozessabruf abgefragt wird) für das Zeitdelta 0 zu sein. Drittens hätte ich die ganze Sache einfach in double
erledigt.
Nebenbei sieht diese Funktion wie ein gutes Beispiel dafür aus, warum Sie keine Kommentare im Code haben sollten.
#include <stdio.h>
#include <time.h>
volatile float calc_percent(
unsigned long utime,
time_t now,
time_t start
) {
return 100.0f * (utime/1e6)/(now - start);
}
int main(void) {
printf("%3.2f\n", calc_percent(1e6, time(NULL), time(NULL)));
printf("%3.2f\n", calc_percent(0, time(NULL), time(NULL)));
return 0;
}
Diese Ausgänge inf
im ersten Fall und nan
im zweiten Fall, wenn sie mit Cygwin gcc-4 auf Windows zusammengestellt. Ich weiß nicht, ob dieses Verhalten Standard ist oder was genau mit dieser speziellen Kombination von OS + Compiler passiert.