@@ -110,11 +110,75 @@ BENCHMARK_TEMPLATE2(BM_Record, DistributionAggregation, CumulativeWindow)
110110BENCHMARK_TEMPLATE2 (BM_Record, DistributionAggregation, IntervalWindow)
111111 ->Range (1 , 16 );
112112
113+ // Benchmarks batched recording against a set of measures with a small number of
114+ // views on each, matching RPC stats recording.
115+ void BM_RecordBatched (benchmark::State& state) {
116+ const std::string tag_key_1 = " tag_key_1" ;
117+ const std::string tag_key_2 = " tag_key_2" ;
118+ const int num_measures = 6 ;
119+ std::vector<MeasureDouble> measures;
120+ std::vector<std::unique_ptr<View>> views;
121+ for (int i = 0 ; i < num_measures; ++i) {
122+ const std::string measure_name = MakeUniqueName ();
123+ measures.push_back (MeasureRegistry::RegisterDouble (measure_name, " " , " " ));
124+
125+ const ViewDescriptor count_descriptor =
126+ ViewDescriptor ()
127+ .set_measure (measure_name)
128+ .set_name (absl::StrCat (" count_" , measure_name))
129+ .set_aggregation (Aggregation::Count ())
130+ .set_aggregation_window (AggregationWindow::Cumulative ())
131+ .add_column (tag_key_1)
132+ .add_column (tag_key_2);
133+ views.push_back (absl::make_unique<View>(count_descriptor));
134+
135+ const ViewDescriptor sum_descriptor =
136+ ViewDescriptor ()
137+ .set_measure (measure_name)
138+ .set_name (absl::StrCat (" sum_" , measure_name))
139+ .set_aggregation (Aggregation::Sum ())
140+ .set_aggregation_window (AggregationWindow::Cumulative ())
141+ .add_column (tag_key_1)
142+ .add_column (tag_key_2);
143+ views.push_back (absl::make_unique<View>(sum_descriptor));
144+
145+ const ViewDescriptor distribution_descriptor =
146+ ViewDescriptor ()
147+ .set_measure (measure_name)
148+ .set_name (absl::StrCat (" distribution_" , measure_name))
149+ .set_aggregation (Aggregation::Distribution (
150+ BucketBoundaries::Exponential (10 , 10 , 2 )))
151+ .set_aggregation_window (AggregationWindow::Cumulative ())
152+ .add_column (tag_key_1)
153+ .add_column (tag_key_2);
154+ views.push_back (absl::make_unique<View>(distribution_descriptor));
155+ }
156+
157+ std::vector<std::string> tag_values (10 );
158+ for (int i = 0 ; i < 10 ; ++i) {
159+ tag_values[i] = absl::StrCat (" value" , i);
160+ }
161+ int iteration = 0 ;
162+ for (auto _ : state) {
163+ Record ({{measures[0 ], static_cast <double >(iteration)},
164+ {measures[1 ], static_cast <double >(iteration)},
165+ {measures[2 ], static_cast <double >(iteration)},
166+ {measures[3 ], static_cast <double >(iteration)},
167+ {measures[4 ], static_cast <double >(iteration)},
168+ {measures[5 ], static_cast <double >(iteration)}},
169+ {{tag_key_1, tag_values[iteration % tag_values.size ()]},
170+ {tag_key_2, tag_values[iteration % (tag_values.size () - 1 )]}});
171+ ++iteration;
172+ }
173+ }
174+ BENCHMARK (BM_RecordBatched);
175+
113176// TODO: Other useful benchmarks:
114177// - Multithreaded recording against one/different measures.
115178// - Recording with parameterized numbers of tag keys.
116179
117180} // namespace
118181} // namespace stats
119182} // namespace opencensus
183+
120184BENCHMARK_MAIN ();
0 commit comments