3
* Copyright 2015, Google Inc.
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions are
10
* * Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* * Redistributions in binary form must reproduce the above
13
* copyright notice, this list of conditions and the following disclaimer
14
* in the documentation and/or other materials provided with the
16
* * Neither the name of Google Inc. nor the names of its
17
* contributors may be used to endorse or promote products derived from
18
* this software without specific prior written permission.
20
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
#include "src/core/iomgr/time_averaged_stats.h"
36
void grpc_time_averaged_stats_init(grpc_time_averaged_stats *stats,
37
double init_avg, double regress_weight,
38
double persistence_factor) {
39
stats->init_avg = init_avg;
40
stats->regress_weight = regress_weight;
41
stats->persistence_factor = persistence_factor;
42
stats->batch_total_value = 0;
43
stats->batch_num_samples = 0;
44
stats->aggregate_total_weight = 0;
45
stats->aggregate_weighted_avg = init_avg;
48
void grpc_time_averaged_stats_add_sample(grpc_time_averaged_stats *stats,
50
stats->batch_total_value += value;
51
++stats->batch_num_samples;
54
double grpc_time_averaged_stats_update_average(
55
grpc_time_averaged_stats *stats) {
56
/* Start with the current batch: */
57
double weighted_sum = stats->batch_total_value;
58
double total_weight = stats->batch_num_samples;
59
if (stats->regress_weight > 0) {
60
/* Add in the regression towards init_avg_: */
61
weighted_sum += stats->regress_weight * stats->init_avg;
62
total_weight += stats->regress_weight;
64
if (stats->persistence_factor > 0) {
65
/* Add in the persistence: */
66
const double prev_sample_weight =
67
stats->persistence_factor * stats->aggregate_total_weight;
68
weighted_sum += prev_sample_weight * stats->aggregate_weighted_avg;
69
total_weight += prev_sample_weight;
71
stats->aggregate_weighted_avg =
72
(total_weight > 0) ? (weighted_sum / total_weight) : stats->init_avg;
73
stats->aggregate_total_weight = total_weight;
74
stats->batch_num_samples = 0;
75
stats->batch_total_value = 0;
76
return stats->aggregate_weighted_avg;