目标
- 维护一段win时间内的三个best最大值或者最小值,以最大值为例
- 值大小上,1st best > 2nd best > 3rd best
- 采集时间,1st best < 2nd best < 3rd best
注:win时间,表示一个窗口时间,或者说一段时间
代码分析
以最大值为例进行分析
基本结构体
一个样本,包含一个时间值和一个大小,其中时间值没有单位,由调用者决定,只要保证和win时间的单位一致即可,所以可以是秒,可以是10s
/* A single data point for our parameterized min-max tracker */
struct minmax_sample {
u32 t; /* time measurement was taken */
u32 v; /* value measured */
};
状态跟踪结构体,三个样本
/* State for the parameterized min-max tracker */
struct minmax {
struct minmax_sample s[3];
};
重置
static inline u32 minmax_reset(struct minmax *m, u32 t, u32 meas)
{
struct minmax_sample val = { .t = t, .v = meas };
m->s[2] = m->s[1] = m->s[0] = val;
return m->s[0].v;
}
将三个best值全部设置为传入的时间值和样本值。
更新最大值
/* Check if new measurement updates the 1st, 2nd or 3rd choice max. */
u32 minmax_running_max(struct minmax *m, u32 win, u32 t, u32 meas)
{
struct minmax_sample val = { .t = t, .v = meas };
if (unlikely(val.v >= m->s[0].v) || /* found new max? */
unlikely(val.t - m->s[2].t > win)) /* nothing left in window? */
return minmax_reset(m, t, meas); /* forget earlier samples */
if (unlikely(val.v >= m->s[1].v))
m->s[2] = m->s[1] = val;
else if (unlikely(val.v >= m->s[2].v))
m->s[2] = val;
return minmax_subwin_update(m, win, &val);
}
用流程图表示: