Я пытаюсь использовать аккумуляторы, чтобы узнать статистику для данной активности в секунду. Ниже приведены две статистики, которые я хотел бы вычислить.
Количество активаций активности
Сумма общего веса, вызванного активностью.
Для достижения этого я предположил гранулярность на 10 мс и рассмотрел 100 сегментов (в секунду).
Поток активности вставляется в аккумулятор всякий раз, когда происходит событие
Null Activity Thread пробуждается каждые 10 мс, чтобы вставить 0 в вес.
Псевдокод ниже
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_count.hpp>
#include <boost/accumulators/statistics/rolling_sum.hpp>
using namespace boost::accumulators;
#define MAX_WEIGHT 100
#define MAX_ACIVITY 10
accumulator_set<double, features<tag::rolling_count, tag::rolling_sum> > acc(tag::rolling_window::window_size = 100);
void null_run()//invoked every 10 msecs
{
//mutex protected
acc(0);
}
void activity_triggered(int weight) // triggered by an external event
{
//mutex protected
acc(weight);
if (checkStatus() == false)
{
printf("Max quantity per sec reached stop ");
exit()
}
}
bool checkStatus()
{
int weightPerSec = rolling_sum(acc);
//here I would like to get the count only if non zero may be rolling_count_non_zero()??
int acitivitiesPersec = rolling_count(acc);
if (weightPerSec > MAX_WEIGHT)
return false;
if (acitivitiesPersec > MAX_ACTIVITY)
return false;
return true;
}
Используя описанную выше технику, я могу достичь веса, введенного в последнюю секунду, но как мне узнать, сколько раз активность запускалась за последнюю секунду с использованием аккумуляторов повышения?