blob: da9cae6f281ff80b4d69287728d0f76091e664b9 [file] [log] [blame]
ctillerc1ddffb2014-12-15 13:08:18 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
ctillerc1ddffb2014-12-15 13:08:18 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
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
15 * distribution.
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.
19 *
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.
31 *
32 */
33
Craig Tiller9533d042016-03-25 17:11:06 -070034#include "src/core/lib/iomgr/time_averaged_stats.h"
ctillerc1ddffb2014-12-15 13:08:18 -080035
Craig Tillera82950e2015-09-22 12:33:20 -070036void grpc_time_averaged_stats_init(grpc_time_averaged_stats* stats,
37 double init_avg, double regress_weight,
38 double persistence_factor) {
ctillerc1ddffb2014-12-15 13:08:18 -080039 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;
46}
47
Craig Tillera82950e2015-09-22 12:33:20 -070048void grpc_time_averaged_stats_add_sample(grpc_time_averaged_stats* stats,
49 double value) {
ctillerc1ddffb2014-12-15 13:08:18 -080050 stats->batch_total_value += value;
51 ++stats->batch_num_samples;
52}
53
Craig Tillera82950e2015-09-22 12:33:20 -070054double grpc_time_averaged_stats_update_average(
55 grpc_time_averaged_stats* stats) {
ctillerc1ddffb2014-12-15 13:08:18 -080056 /* Start with the current batch: */
57 double weighted_sum = stats->batch_total_value;
58 double total_weight = stats->batch_num_samples;
Craig Tillera82950e2015-09-22 12:33:20 -070059 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;
63 }
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;
70 }
71 stats->aggregate_weighted_avg =
72 (total_weight > 0) ? (weighted_sum / total_weight) : stats->init_avg;
ctillerc1ddffb2014-12-15 13:08:18 -080073 stats->aggregate_total_weight = total_weight;
74 stats->batch_num_samples = 0;
75 stats->batch_total_value = 0;
76 return stats->aggregate_weighted_avg;
Craig Tiller190d3602015-02-18 09:23:38 -080077}