[metrics] Add timer conveniences
This adds convenience timers for each of the metrics. The timer's can be
backed by a Counter, in which case the Counter will store cumulative
time elapsed, or by a Histogram, in which case the timer will increment
a bucket based on the time between a particular start/stop pair.
Timers can either be manually started and stopped, or can be used
automatically in an RAII manner.
Bug: 170149255
Test: m test-art-host-gtest-art_libartbase_tests
Change-Id: I4fc77e35f3e7b67c12fc004b72bf4fe177dc3151
diff --git a/libartbase/base/metrics_test.cc b/libartbase/base/metrics_test.cc
index 54306d6..67ad313 100644
--- a/libartbase/base/metrics_test.cc
+++ b/libartbase/base/metrics_test.cc
@@ -67,6 +67,53 @@
EXPECT_EQ(6u, test_counter.Value());
}
+TEST_F(MetricsTest, CounterTimer) {
+ MetricsCounter test_counter;
+ {
+ AutoTimer timer{&test_counter};
+ // Sleep for 2µs so the counter will be greater than 0.
+ NanoSleep(2'000);
+ }
+ EXPECT_GT(test_counter.Value(), 0u);
+}
+
+TEST_F(MetricsTest, CounterTimerExplicitStop) {
+ MetricsCounter test_counter;
+ AutoTimer timer{&test_counter};
+ // Sleep for 2µs so the counter will be greater than 0.
+ NanoSleep(2'000);
+ timer.Stop();
+ EXPECT_GT(test_counter.Value(), 0u);
+}
+
+TEST_F(MetricsTest, CounterTimerExplicitStart) {
+ MetricsCounter test_counter;
+ {
+ AutoTimer timer{&test_counter, /*autostart=*/false};
+ // Sleep for 2µs so the counter will be greater than 0.
+ NanoSleep(2'000);
+ }
+ EXPECT_EQ(test_counter.Value(), 0u);
+
+ {
+ AutoTimer timer{&test_counter, /*autostart=*/false};
+ timer.Start();
+ // Sleep for 2µs so the counter will be greater than 0.
+ NanoSleep(2'000);
+ }
+ EXPECT_GT(test_counter.Value(), 0u);
+}
+
+TEST_F(MetricsTest, CounterTimerExplicitStartStop) {
+ MetricsCounter test_counter;
+ AutoTimer timer{&test_counter, /*autostart=*/false};
+ // Sleep for 2µs so the counter will be greater than 0.
+ timer.Start();
+ NanoSleep(2'000);
+ timer.Stop();
+ EXPECT_GT(test_counter.Value(), 0u);
+}
+
TEST_F(MetricsTest, DatumName) {
EXPECT_EQ("ClassVerificationTotalTime", DatumName(DatumId::kClassVerificationTotalTime));
}
@@ -171,6 +218,17 @@
metrics.ReportAllMetrics(&backend);
}
+TEST_F(MetricsTest, HistogramTimer) {
+ TestMetricsHistogram<1, 0, 100> test_histogram;
+ {
+ AutoTimer timer{&test_histogram};
+ // Sleep for 2µs so the counter will be greater than 0.
+ NanoSleep(2'000);
+ }
+
+ EXPECT_GT(test_histogram.GetBucketsForTest()[0], 0u);
+}
+
} // namespace metrics
} // namespace art