server/dep/ACE_wrappers/ace/Throughput_Stats.cpp
Neo2003 23c920ca4b [10643] Update the ACE part we use to 5.8.2
Signed-off-by: Neo2003 <Neo.2003@Hotmail.fr>
2010-10-25 20:36:51 +02:00

202 lines
6 KiB
C++

// $Id: Throughput_Stats.cpp 91286 2010-08-05 09:04:31Z johnnyw $
#include "ace/Throughput_Stats.h"
#include "ace/OS_NS_stdio.h"
#include "ace/OS_NS_string.h"
#include "ace/High_Res_Timer.h"
#include "ace/Log_Msg.h"
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
ACE_Throughput_Stats::ACE_Throughput_Stats (void)
: 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::sample (ACE_UINT64 throughput,
ACE_UINT64 latency)
{
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 */
}
}
void
ACE_Throughput_Stats::accumulate (const ACE_Throughput_Stats &rhs)
{
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 sf)
{
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 sf,
ACE_UINT64 elapsed_time,
ACE_UINT32 samples_count)
{
#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 */
}
ACE_END_VERSIONED_NAMESPACE_DECL