Line data Source code
1 : /*
2 : *
3 : * Copyright 2015, Google Inc.
4 : * 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 :
34 : #include "src/core/iomgr/time_averaged_stats.h"
35 :
36 110696 : void grpc_time_averaged_stats_init(grpc_time_averaged_stats* stats,
37 : double init_avg, double regress_weight,
38 : double persistence_factor) {
39 110696 : stats->init_avg = init_avg;
40 110696 : stats->regress_weight = regress_weight;
41 110696 : stats->persistence_factor = persistence_factor;
42 110696 : stats->batch_total_value = 0;
43 110696 : stats->batch_num_samples = 0;
44 110696 : stats->aggregate_total_weight = 0;
45 110696 : stats->aggregate_weighted_avg = init_avg;
46 110696 : }
47 :
48 1061159 : void grpc_time_averaged_stats_add_sample(grpc_time_averaged_stats* stats,
49 : double value) {
50 1061159 : stats->batch_total_value += value;
51 1061159 : ++stats->batch_num_samples;
52 1061159 : }
53 :
54 264068 : double grpc_time_averaged_stats_update_average(
55 : grpc_time_averaged_stats* stats) {
56 : /* Start with the current batch: */
57 264068 : double weighted_sum = stats->batch_total_value;
58 264068 : double total_weight = stats->batch_num_samples;
59 264068 : if (stats->regress_weight > 0) {
60 : /* Add in the regression towards init_avg_: */
61 264058 : weighted_sum += stats->regress_weight * stats->init_avg;
62 264058 : total_weight += stats->regress_weight;
63 : }
64 264068 : if (stats->persistence_factor > 0) {
65 : /* Add in the persistence: */
66 264058 : const double prev_sample_weight =
67 264058 : stats->persistence_factor * stats->aggregate_total_weight;
68 264058 : weighted_sum += prev_sample_weight * stats->aggregate_weighted_avg;
69 264058 : total_weight += prev_sample_weight;
70 : }
71 264068 : stats->aggregate_weighted_avg =
72 264068 : (total_weight > 0) ? (weighted_sum / total_weight) : stats->init_avg;
73 264068 : stats->aggregate_total_weight = total_weight;
74 264068 : stats->batch_num_samples = 0;
75 264068 : stats->batch_total_value = 0;
76 264068 : return stats->aggregate_weighted_avg;
77 : }
|