Skip to content

Commit

Permalink
Adding new statistics performance counters:
Browse files Browse the repository at this point in the history
- rolling_variance, rolling_max, rolling_min
  • Loading branch information
hkaiser committed Jun 6, 2017
1 parent 67870fc commit 65c8ec1
Show file tree
Hide file tree
Showing 7 changed files with 524 additions and 9 deletions.
53 changes: 48 additions & 5 deletions docs/manual/existing_performance_counters.qbk
Expand Up @@ -1295,23 +1295,38 @@ system and application performance.
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.]
]
[ [`/statistics/rolling_average`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
[Returns the current rolling average (mean) value calculated based on the values
queried from the underlying counter (the one specified as the instance
name).]
[Any parameter will be interpreted as a list of two comma separated (integer)
values, where the first is the time interval (in
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.
The second value will be interpreted as the size of the rolling window
(the number of latest values to use to calculate the rolling average). The
default value for this is `10`.]
]
[ [`/statistics/stddev`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
[Returns the current standard deviation (stddev) value calculated based
on the values queried from the underlying counter (the one specified
as the instance name).]
as the instance name). Note that this counter will be available only
for Boost V1.56 and newer.]
[Any parameter will be interpreted as the time interval (in
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the
default.]
]
[ [`/statistics/rolling_average`]
[ [`/statistics/rolling_stddev`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
[Returns the current rolling average (mean) value calculated based on the values
queried from the underlying counter (the one specified as the instance
name).]
[Returns the current rolling variance (stddev) value calculated based on
the values queried from the underlying counter (the one specified as
the instance name).]
[Any parameter will be interpreted as a list of two comma separated (integer)
values, where the first is the time interval (in
milliseconds) at which the underlying counter should be queried. If
Expand Down Expand Up @@ -1340,6 +1355,20 @@ system and application performance.
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.]
]
[ [`/statistics/rolling_max`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
[Returns the current rolling maximum value calculated based on
the values queried from the underlying counter (the one specified as
the instance name).]
[Any parameter will be interpreted as a list of two comma separated (integer)
values, where the first is the time interval (in
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.
The second value will be interpreted as the size of the rolling window
(the number of latest values to use to calculate the rolling average). The
default value for this is `10`.]
]
[ [`/statistics/min`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
Expand All @@ -1350,6 +1379,20 @@ system and application performance.
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.]
]
[ [`/statistics/rolling_min`]
[Any full performance counter name. The referenced performance counter
is queried at fixed time intervals as specified by the first parameter.]
[Returns the current rolling minimum value calculated based on
the values queried from the underlying counter (the one specified as
the instance name).]
[Any parameter will be interpreted as a list of two comma separated (integer)
values, where the first is the time interval (in
milliseconds) at which the underlying counter should be queried. If
no value is specified, the counter will assume `1000` \[ms\] as the default.
The second value will be interpreted as the size of the rolling window
(the number of latest values to use to calculate the rolling average). The
default value for this is `10`.]
]
]

[/////////////////////////////////////////////////////////////////////////////]
Expand Down
1 change: 0 additions & 1 deletion hpx/util/histogram.hpp
Expand Up @@ -10,7 +10,6 @@

#include <boost/range/iterator_range.hpp>
#include <boost/parameter/keyword.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/accumulators/framework/accumulator_base.hpp>
#include <boost/accumulators/framework/extractor.hpp>
#include <boost/accumulators/numeric/functional.hpp>
Expand Down
116 changes: 116 additions & 0 deletions hpx/util/rolling_max.hpp
@@ -0,0 +1,116 @@
// Copyright (c) 2017 Hartmut Kaiser
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#ifndef ROLLING_MAX_HPP
#define ROLLING_MAX_HPP

#include <hpx/config.hpp>

#include <boost/accumulators/framework/accumulator_base.hpp>
#include <boost/accumulators/framework/extractor.hpp>
#include <boost/accumulators/numeric/functional.hpp>
#include <boost/accumulators/framework/parameters/sample.hpp>
#include <boost/accumulators/framework/depends_on.hpp>
#include <boost/accumulators/statistics_fwd.hpp>
#include <boost/accumulators/statistics/rolling_window.hpp>

namespace hpx { namespace util
{
namespace detail
{
template <typename Sample>
struct rolling_max_impl : boost::accumulators::accumulator_base
{
typedef Sample float_type;

// for boost::result_of
typedef float_type result_type;

template <typename Args>
rolling_max_impl(Args const& args)
: max_(boost::numeric::as_min(Sample())),
is_dirty_(false)
{
}

template <typename Args>
void operator()(Args const& args)
{
boost::accumulators::find_accumulator<
boost::accumulators::tag::rolling_window
>(args[boost::accumulators::accumulator])(args);
is_dirty_ = true;
}

template <typename Args>
result_type result(Args const &args) const
{
if (is_dirty_)
{
using namespace boost::accumulators;

max_ = boost::numeric::as_min(Sample());

// work around problem in older Boost versions
auto r = rolling_window_plus1(args);
bool full = impl::is_rolling_window_plus1_full(args);

for (auto const& s : r.advance_begin(full ? 1 : 0))
{
boost::numeric::max_assign(max_, s);
}

is_dirty_ = false;
}
return max_;
}

private:
mutable Sample max_;
mutable bool is_dirty_;
};
}
}}

///////////////////////////////////////////////////////////////////////////////
// tag::rolling_max
namespace boost { namespace accumulators
{
namespace tag
{
struct rolling_max
: depends_on<rolling_window>
{
struct impl
{
template <typename Sample, typename Weight>
struct apply
{
typedef hpx::util::detail::rolling_max_impl<Sample> type;
};
};
};
}

///////////////////////////////////////////////////////////////////////////////
// extract::rolling_max
namespace extract
{
extractor<tag::rolling_max> const rolling_max = {};
}
}} // namespace boost::accumulators

namespace hpx { namespace util
{
namespace tag
{
using boost::accumulators::tag::rolling_max;
}

using boost::accumulators::extract::rolling_max;
}}

#endif

116 changes: 116 additions & 0 deletions hpx/util/rolling_min.hpp
@@ -0,0 +1,116 @@
// Copyright (c) 2017 Hartmut Kaiser
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#ifndef ROLLING_MIN_HPP
#define ROLLING_MIN_HPP

#include <hpx/config.hpp>

#include <boost/accumulators/framework/accumulator_base.hpp>
#include <boost/accumulators/framework/extractor.hpp>
#include <boost/accumulators/numeric/functional.hpp>
#include <boost/accumulators/framework/parameters/sample.hpp>
#include <boost/accumulators/framework/depends_on.hpp>
#include <boost/accumulators/statistics_fwd.hpp>
#include <boost/accumulators/statistics/rolling_window.hpp>

namespace hpx { namespace util
{
namespace detail
{
template <typename Sample>
struct rolling_min_impl : boost::accumulators::accumulator_base
{
typedef Sample float_type;

// for boost::result_of
typedef float_type result_type;

template <typename Args>
rolling_min_impl(Args const& args)
: min_(boost::numeric::as_max(Sample())),
is_dirty_(false)
{
}

template <typename Args>
void operator()(Args const& args)
{
boost::accumulators::find_accumulator<
boost::accumulators::tag::rolling_window
>(args[boost::accumulators::accumulator])(args);
is_dirty_ = true;
}

template <typename Args>
result_type result(Args const &args) const
{
if (is_dirty_)
{
using namespace boost::accumulators;

min_ = boost::numeric::as_max(Sample());

// work around problem in older Boost versions
auto r = rolling_window_plus1(args);
bool full = impl::is_rolling_window_plus1_full(args);

for (auto const& s : r.advance_begin(full ? 1 : 0))
{
boost::numeric::min_assign(min_, s);
}

is_dirty_ = false;
}
return min_;
}

private:
mutable Sample min_;
mutable bool is_dirty_;
};
}
}}

///////////////////////////////////////////////////////////////////////////////
// tag::rolling_min
namespace boost { namespace accumulators
{
namespace tag
{
struct rolling_min
: depends_on<rolling_window>
{
struct impl
{
template <typename Sample, typename Weight>
struct apply
{
typedef hpx::util::detail::rolling_min_impl<Sample> type;
};
};
};
}

///////////////////////////////////////////////////////////////////////////////
// extract::rolling_min
namespace extract
{
extractor<tag::rolling_min> const rolling_min = {};
}
}} // namespace boost::accumulators

namespace hpx { namespace util
{
namespace tag
{
using boost::accumulators::tag::rolling_min;
}

using boost::accumulators::extract::rolling_min;
}}

#endif

0 comments on commit 65c8ec1

Please sign in to comment.