Я не знаю, почему это происходит, и сейчас я не могу провести стресс-тестирование модуля, пытаясь сгенерировать такие случаи.
Однако принцип, которому я следовал во всех своих исследованиях, заключается не в том, чтобы заменить данные, которые, как я знаю, не имеют смысла, чем-то, что выглядит разумным. У вас в основном отсутствуют наблюдения, и вы должны относиться к ним как к таковым. Я бы вообще не прикрепил числовое значение, чтобы не притворяться, что у меня есть информация, а на самом деле у меня ее нет.
Тогда ваша статистика по непропущенным точкам будет иметь смысл, и вы сможете посмотреть на любые закономерности в пропущенных наблюдениях отдельно.
ОБНОВЛЕНИЕ: Просмотр функции calc_prec()
в исходном коде :
/* 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);
}
}
Во-первых, ИМХО, было бы лучше просто разделить на 1e4, а не умножать на 100.0f после деления. Во-вторых, возможно (если опросить сразу после запуска процесса), чтобы дельта времени была 0. В-третьих, я бы просто сделал все это в double
.
Кроме того, эта функция выглядит как хороший пример того, почему у вас не должно быть комментариев в коде.
#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;
}
Это выводит inf
в первом случае и nan
во втором случае при компиляции с Cygwin gcc-4 в Windows. Я не знаю, является ли это поведение стандартным или только то, что происходит с этой конкретной комбинацией OS + компилятор.