The class Buffer in Ex_ClientServer shows how to
collect the average queue length. The default implementation of
Get_Statistics_s() at Atomic is to return
Get_s(). However, Buffer overrides the
Get_Statistics_s() such that it returns the number of jobs
waiting in a buffer as follows.
/*virtual*/ string Get_Statistics_s() const
{
char tmp[10]; sprintf(tmp, "%d",(int)m_Clients.size());
return string(tmp); // length Only
}
The class Buffer inherits Atomic::when_receive_cs()
shown in the previous section. But it overrides
GetPerformance() function as follows.
/*virtual*/ map<string, double> Buffer::GetPerformance() const
{
map<string, double> statistics;
if(CollectStatisticsFlag()==true) {
TimeSpan E_i=0;// expectation of queue length
for(map<string, double>::const_iterator it = m_statistics.begin();
it != m_statistics.end(); it++)
{
double probability=it->second/TimeCurrent(); // P(i)
if(probability < 0.0 || probability > 1.0) {
THROW_DEVS_EXCEPTION("Invalid Probability!");
}
else{
int i = atoi(it->first.data());
E_i += probability * i;// E(i)=\Sum_{i} i * P(i)
}
}
string str = "Average Q length: ";
statistics.insert(make_pair(str, E_i));
}
return statistics;
}
It makes i) using m_statistics[i]. Then it
makes i*i) for all
i as defined in Equation (4.7).