[metrics] Add ClassLoadingTotalTime counter
This keeps track of how much time we spend in the class loading
process.
Testing instructions:
adb shell setprop dalvik.vm.metrics.write-to-log true
adb shell stop && adb shell start
adb logcat -e "ART internal metrics"
Observer ClassLoadingTotalTime in internal metrics report. Example:
*** ART internal metrics ***
Metadata:
timestamp_since_start_ms: 34555
session_id: 2710488913234081424
uid: 10065
compilation_reason: Unknown
compiler_filter: (unspecified)
Metrics:
ClassLoadingTotalTime: count = 120959
ClassVerificationTotalTime: count = 216121
JitMethodCompileTime: range = 0...1000000, buckets: 4482,10,2,3
*** Done dumping ART internal metrics ***
Bug: 177591870
Test: Manual, see above
Change-Id: I24f0c94ab6af5e6cd9b0dc32122f2905c36cf3b7
diff --git a/libartbase/base/metrics/metrics.h b/libartbase/base/metrics/metrics.h
index f6eed56..ee6b1f8 100644
--- a/libartbase/base/metrics/metrics.h
+++ b/libartbase/base/metrics/metrics.h
@@ -35,7 +35,9 @@
#pragma clang diagnostic error "-Wconversion"
// COUNTER(counter_name)
-#define ART_COUNTERS(COUNTER) COUNTER(ClassVerificationTotalTime)
+#define ART_COUNTERS(COUNTER) \
+ COUNTER(ClassLoadingTotalTime) \
+ COUNTER(ClassVerificationTotalTime)
// HISTOGRAM(counter_name, num_buckets, minimum_value, maximum_value)
//
diff --git a/libartbase/base/metrics/metrics_test.cc b/libartbase/base/metrics/metrics_test.cc
index 4643f14..44a3b60 100644
--- a/libartbase/base/metrics/metrics_test.cc
+++ b/libartbase/base/metrics/metrics_test.cc
@@ -215,13 +215,13 @@
// Make sure the resulting string lists all the counters.
const std::string result = backend.GetAndResetBuffer();
#define COUNTER(name) \
- EXPECT_NE(result.find(DatumName(DatumId::k##name)), std::string::npos)
+ EXPECT_NE(result.find(DatumName(DatumId::k##name)), std::string::npos);
ART_COUNTERS(COUNTER);
#undef COUNTER
// Make sure the resulting string lists all the histograms.
#define HISTOGRAM(name, num_buckets, minimum_value, maximum_value) \
- EXPECT_NE(result.find(DatumName(DatumId::k##name)), std::string::npos)
+ EXPECT_NE(result.find(DatumName(DatumId::k##name)), std::string::npos);
ART_HISTOGRAMS(HISTOGRAM);
#undef HISTOGRAM
}
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index d4f2e30..b98708e 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -43,6 +43,7 @@
#include "base/hash_set.h"
#include "base/leb128.h"
#include "base/logging.h"
+#include "base/metrics/metrics.h"
#include "base/mutex-inl.h"
#include "base/os.h"
#include "base/quasi_atomic.h"
@@ -3065,6 +3066,7 @@
const dex::ClassDef& dex_class_def) {
ScopedDefiningClass sdc(self);
StackHandleScope<3> hs(self);
+ metrics::AutoTimer timer{GetMetrics()->ClassLoadingTotalTime()};
auto klass = hs.NewHandle<mirror::Class>(nullptr);
// Load the class from the dex file.