A simple class to make throughput and latency analysis. More...
#include <Throughput_Stats.h>


Public Member Functions | |
| ACE_Throughput_Stats (void) | |
| Constructor. | |
| void | sample (ACE_UINT64 throughput, ACE_UINT64 latency) |
| Store one sample. | |
| void | accumulate (const ACE_Throughput_Stats &throughput) |
| Update the values to reflect the stats in throughput. | |
| void | dump_results (const ACE_TCHAR *msg, ACE_UINT32 scale_factor) |
| Print down the stats. | |
Static Public Member Functions | |
| static void | dump_throughput (const ACE_TCHAR *msg, ACE_UINT32 scale_factor, ACE_UINT64 elapsed_time, ACE_UINT32 samples_count) |
| Dump the average throughput stats. | |
Private Attributes | |
| ACE_UINT64 | throughput_last_ |
| The last throughput measurement. | |
A simple class to make throughput and latency analysis.
Keep the relevant information to perform throughput and latency analysis, including:
Definition at line 45 of file Throughput_Stats.h.
| ACE_Throughput_Stats::ACE_Throughput_Stats | ( | void | ) |
Constructor.
Definition at line 14 of file Throughput_Stats.cpp.
: ACE_Basic_Stats () , throughput_last_ (0) #if 0 // @@TODO: This is what I really wanted to compute, but it just // does not work. , throughput_sum_x_ (0) , throughput_sum_x2_ (0) , throughput_sum_y_ (0) , throughput_sum_y2_ (0) , throughput_sum_xy_ (0) #endif /* 0 */ { }
| void ACE_Throughput_Stats::accumulate | ( | const ACE_Throughput_Stats & | throughput | ) |
Update the values to reflect the stats in throughput.
Definition at line 70 of file Throughput_Stats.cpp.
{
if (rhs.samples_count () == 0u)
return;
this->ACE_Basic_Stats::accumulate (rhs);
if (this->samples_count () == 0u)
{
this->throughput_last_ = rhs.throughput_last_;
#if 0
// @@TODO: This is what I really wanted to compute, but it just
// does not work.
this->throughput_sum_x_ = rhs.throughput_sum_x_;
this->throughput_sum_x2_ = rhs.throughput_sum_x2_;
this->throughput_sum_y_ = rhs.throughput_sum_y_;
this->throughput_sum_y2_ = rhs.throughput_sum_y2_;
this->throughput_sum_xy_ = rhs.throughput_sum_xy_;
#endif /* 0 */
return;
}
if (this->throughput_last_ < rhs.throughput_last_)
this->throughput_last_ = rhs.throughput_last_;
#if 0
// @@TODO: This is what I really wanted to compute, but it just
// does not work.
this->throughput_sum_x_ += rhs.throughput_sum_x_;
this->throughput_sum_x2_ += rhs.throughput_sum_x2_;
this->throughput_sum_y_ += rhs.throughput_sum_y_;
this->throughput_sum_y2_ += rhs.throughput_sum_y2_;
this->throughput_sum_xy_ += rhs.throughput_sum_xy_;
#endif /* 0 */
}
| void ACE_Throughput_Stats::dump_results | ( | const ACE_TCHAR * | msg, | |
| ACE_UINT32 | scale_factor | |||
| ) |
Print down the stats.
Definition at line 109 of file Throughput_Stats.cpp.
{
if (this->samples_count () == 0u)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("%s : no data collected\n"), msg));
return;
}
this->ACE_Basic_Stats::dump_results (msg, sf);
ACE_Throughput_Stats::dump_throughput (msg, sf,
this->throughput_last_,
this->samples_count ());
#if 0
// @@TODO: This is what I really wanted to generate, but it just
// doesn't work.
double t_sum_x =
ACE_CU64_TO_CU32 (this->throughput_sum_x_);// / sf);
//t_sum_x /= 1000000.0;
double t_sum_y =
ACE_CU64_TO_CU32 (this->throughput_sum_y_);
double t_sum_x2 =
ACE_CU64_TO_CU32 (this->throughput_sum_x2_);// / (sf*sf));
//t_sum_x2 /= 1000000.0;
//t_sum_x2 /= 1000000.0;
double t_sum_y2 =
ACE_CU64_TO_CU32 (this->throughput_sum_y2_);
double t_sum_xy =
ACE_CU64_TO_CU32 (this->throughput_sum_xy_);// / sf);
//t_sum_xy /= 1000000.0;
double t_avgx = t_sum_x / this->samples_count ();
double t_avgy = t_sum_y / this->samples_count ();
double t_a =
(this->samples_count () * t_sum_xy - t_sum_x * t_sum_y)
/ (this->samples_count () * t_sum_x2 - t_sum_x * t_sum_x);
double t_b = (t_avgy - t_a * t_avgx);
t_a *= 1000000.0;
double d_r =
(t_sum_xy - t_avgx * t_sum_y - t_avgy * t_sum_x
+ this->samples_count () * t_avgx * t_avgy);
double n_r =
(t_sum_x2
- this->samples_count () * t_avgx * t_avgx)
* (t_sum_y2
- this->samples_count () * t_avgy * t_avgy);
double t_r = d_r * d_r / n_r;
// ACE_DEBUG ((LM_DEBUG,
// "%s throughput: %.2f/%.2f/%.2f/%.6f/%.2f (avg/a/b/r/elapsed)\n",
// msg, t_avg, t_a, t_b, t_r, seconds));
// ACE_DEBUG ((LM_DEBUG,
// "%s data: %.2f/%.2f/%.2f/%.6f/%.2f (x/x2/y/y2/xy)\n",
// msg, t_sum_x, t_sum_x2, t_sum_y, t_sum_y2, t_sum_xy));
#endif
}
| void ACE_Throughput_Stats::dump_throughput | ( | const ACE_TCHAR * | msg, | |
| ACE_UINT32 | scale_factor, | |||
| ACE_UINT64 | elapsed_time, | |||
| ACE_UINT32 | samples_count | |||
| ) | [static] |
Dump the average throughput stats.
Definition at line 172 of file Throughput_Stats.cpp.
{
#ifndef ACE_NLOGGING
double seconds =
# if defined ACE_LACKS_LONGLONG_T
elapsed_time / sf;
#elif defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER (
ACE_U_LongLong(elapsed_time / sf)));
# else /* ! ACE_LACKS_LONGLONG_T */
static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER (elapsed_time / sf));
# endif /* ! ACE_LACKS_LONGLONG_T */
seconds /= ACE_HR_SCALE_CONVERSION;
const double t_avg = samples_count / seconds;
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("%s throughput: %.2f (events/second)\n"),
msg, t_avg));
#else
ACE_UNUSED_ARG (msg);
ACE_UNUSED_ARG (sf);
ACE_UNUSED_ARG (elapsed_time);
ACE_UNUSED_ARG (samples_count);
#endif /* ACE_NLOGGING */
}
| void ACE_Throughput_Stats::sample | ( | ACE_UINT64 | throughput, | |
| ACE_UINT64 | latency | |||
| ) |
Store one sample.
Definition at line 30 of file Throughput_Stats.cpp.
{
this->ACE_Basic_Stats::sample (latency);
if (this->samples_count () == 1u)
{
this->throughput_last_ = throughput;
#if 0
// @@TODO: This is what I really wanted to compute, but it just
// does not work.
this->throughput_sum_y_ = this->samples_count_;
this->throughput_sum_y2_ = this->samples_count_ * this->samples_count_;
this->throughput_sum_x_ = throughput;
this->throughput_sum_x2_ = throughput * throughput;
this->throughput_sum_xy_ = throughput * this->samples_count_;
ACE_OS::printf ("%f %qu\n", throughput / 400000000.0, this->samples_count_);
#endif /* 0 */
}
else
{
this->throughput_last_ = throughput;
#if 0
// @@TODO: This is what I really wanted to compute, but it just
// does not work.
this->throughput_sum_y_ += this->samples_count_;
this->throughput_sum_y2_ += this->samples_count_ * this->samples_count_;
this->throughput_sum_x_ += throughput;
this->throughput_sum_x2_ += throughput * throughput;
this->throughput_sum_xy_ += throughput * this->samples_count_;
ACE_OS::printf ("%f %qu\n", throughput / 400000000.0, this->samples_count_);
#endif /* 0 */
}
}
The last throughput measurement.
Definition at line 67 of file Throughput_Stats.h.
1.7.0