21 template<
typename MeteredObjType>
28 template<
class MeteredObjType,
class Fn>
32 for (
auto i=
typename ave_deviation_meter<MeteredObjType>::value_type();i<computations;++i) {
33 meter.update(fn.operator()());
38 template<
class MeteredObjType,
class Fn>
42 for (
auto i=
typename ave_deviation_meter<MeteredObjType>::value_type();i<computations;++i) {
43 meter.first.update(fn.operator()());
44 if (meter.first.deviation_percentage()<=target_deviation) {
52 template<
typename MeteredObjType>
inline void
55 assert(num_samples_>0 || ((minimum_>=std::numeric_limits<value_type>::max()) && (maximum_<=std::numeric_limits<value_type>::min()) && num_samples_==0));
56 assert((minimum_>=std::numeric_limits<value_type>::max()) || (minimum_<=arithmetic_mean_));
57 assert((maximum_<=std::numeric_limits<value_type>::min()) || (arithmetic_mean_<=maximum_));
58 assert(maximum_<=total_);
65 template<
typename MeteredObjType>
inline constexpr
75 template<
typename MeteredObjType>
inline constexpr
81 ave_deviation(
std::abs(arithmetic_mean_)) {
84 template<
typename MeteredObjType>
inline constexpr
93 template<
typename MeteredObjType>
inline
95 : num_samples_(rm.num_samples_),
98 arithmetic_mean_(rm.arithmetic_mean_),
99 ave_deviation(rm.ave_deviation) {
103 template<
typename MeteredObjType>
inline
109 num_samples_=rm.num_samples_;
110 minimum_=rm.minimum_;
111 maximum_=rm.maximum_;
113 arithmetic_mean_=rm.arithmetic_mean_;
114 ave_deviation=rm.ave_deviation;
122 minimum_=std::min(minimum_, rm.minimum_);
123 maximum_=std::max(maximum_, rm.maximum_);
125 if (num_samples_+rm.num_samples_) {
126 arithmetic_mean_=(arithmetic_mean_*num_samples_+rm.arithmetic_mean_*rm.num_samples_)/(num_samples_+rm.num_samples_);
128 ave_deviation=(ave_deviation+rm.ave_deviation)/2;
129 num_samples_+=rm.num_samples_;
130 minimum_=std::min(minimum_, rm.minimum_);
138 minimum_=std::min(minimum_, new_val);
139 maximum_=std::max(maximum_, new_val);
141 unsigned long const old_num_samples_=num_samples_++;
142 value_type
const old_arith_mean=arithmetic_mean_;
143 arithmetic_mean_=(arithmetic_mean_*old_num_samples_+new_val)/num_samples_;
144 if (old_num_samples_) {
145 ave_deviation=(std::abs(ave_deviation-(arithmetic_mean_-old_arith_mean))*old_num_samples_+std::abs(new_val-arithmetic_mean_))/num_samples_;
158 return static_cast<value_type>(arithmetic_mean_);
171 template<
typename MeteredObjType>
inline constexpr double
173 return ave_deviation;
176 template<
typename MeteredObjType>
inline constexpr double
178 return ave_deviation*100/arithmetic_mean_;
181 template<
typename MeteredObjType>
inline constexpr unsigned short
186 template<
typename MeteredObjType>
inline tstring
191 <<
_T(
"[")<<minimum_<<
_T(
", ")<<value_type(arithmetic_mean_)<<
_T(
" ~(+/-")<<std::setprecision(2)<<value_type(deviation_percentage())<<
_T(
"%), ")<<maximum_<<
_T(
"]")
192 _T(
", samples=")<<num_samples_
193 <<
_T(
", total=")<<total_;
197 template<
typename MeteredObjType>
inline tstring