diff options
author | 2018-12-21 15:06:17 -0800 | |
---|---|---|
committer | 2018-12-27 13:09:23 -0800 | |
commit | 41dba673345271e53803efb477b86fad5939854c (patch) | |
tree | afebb61a4466b2003c27cd4f08953b096a6c44d3 /compiler/driver/compiler_driver.cc | |
parent | 1650dafad62578a1766bd617d78458a4cf1e2a9a (diff) |
Add dumping for number of classes initialized
For --dump-stats, dump how many classes are each status after
attempting initialization.
Test: <compile_apk> --instruction-set=arm64 --app-image-file=generated.art --dump-stats
Sample output:
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 100% of instance fields resolved for 1575 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 1.88679% of check-casts removed based on type information for 53 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status NotReady for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Retired for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status ErrorResolved for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status ErrorUnresolved for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Idx for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Loaded for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Resolving for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Resolved for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Verifying for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0.0186596% of classes with status RetryVerificationAtRuntime for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status VerifyingAtRuntime for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 28.1916% of classes with status Verified for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status SuperclassValidated for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 0% of classes with status Initializing for 32155 cases
dex2oat I 12-21 19:18:56 58439 58439 compiler_driver.cc:109] 71.7898% of classes with status Initialized for 32155 cases
Bug: 70735003
Test: test-art-host
Change-Id: I57e8a977ee202c0ce85030208caa183344a5567a
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r-- | compiler/driver/compiler_driver.cc | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index f52c566727..8f4969c3e5 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -112,19 +112,7 @@ static void DumpStat(size_t x, size_t y, const char* str) { class CompilerDriver::AOTCompilationStats { public: AOTCompilationStats() - : stats_lock_("AOT compilation statistics lock"), - resolved_instance_fields_(0), unresolved_instance_fields_(0), - resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0), - type_based_devirtualization_(0), - safe_casts_(0), not_safe_casts_(0) { - for (size_t i = 0; i <= kMaxInvokeType; i++) { - resolved_methods_[i] = 0; - unresolved_methods_[i] = 0; - virtual_made_direct_[i] = 0; - direct_calls_to_boot_[i] = 0; - direct_methods_to_boot_[i] = 0; - } - } + : stats_lock_("AOT compilation statistics lock") {} void Dump() { DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved"); @@ -141,6 +129,16 @@ class CompilerDriver::AOTCompilationStats { type_based_devirtualization_, "virtual/interface calls made direct based on type information"); + const size_t total = std::accumulate( + class_status_count_, + class_status_count_ + static_cast<size_t>(ClassStatus::kLast) + 1, + 0u); + for (size_t i = 0; i <= static_cast<size_t>(ClassStatus::kLast); ++i) { + std::ostringstream oss; + oss << "classes with status " << static_cast<ClassStatus>(i); + DumpStat(class_status_count_[i], total - class_status_count_[i], oss.str().c_str()); + } + for (size_t i = 0; i <= kMaxInvokeType; i++) { std::ostringstream oss; oss << static_cast<InvokeType>(i) << " methods were AOT resolved"; @@ -219,26 +217,34 @@ class CompilerDriver::AOTCompilationStats { not_safe_casts_++; } + // Register a class status. + void AddClassStatus(ClassStatus status) REQUIRES(!stats_lock_) { + STATS_LOCK(); + ++class_status_count_[static_cast<size_t>(status)]; + } + private: Mutex stats_lock_; - size_t resolved_instance_fields_; - size_t unresolved_instance_fields_; + size_t resolved_instance_fields_ = 0u; + size_t unresolved_instance_fields_ = 0u; - size_t resolved_local_static_fields_; - size_t resolved_static_fields_; - size_t unresolved_static_fields_; + size_t resolved_local_static_fields_ = 0u; + size_t resolved_static_fields_ = 0u; + size_t unresolved_static_fields_ = 0u; // Type based devirtualization for invoke interface and virtual. - size_t type_based_devirtualization_; + size_t type_based_devirtualization_ = 0u; - size_t resolved_methods_[kMaxInvokeType + 1]; - size_t unresolved_methods_[kMaxInvokeType + 1]; - size_t virtual_made_direct_[kMaxInvokeType + 1]; - size_t direct_calls_to_boot_[kMaxInvokeType + 1]; - size_t direct_methods_to_boot_[kMaxInvokeType + 1]; + size_t resolved_methods_[kMaxInvokeType + 1] = {}; + size_t unresolved_methods_[kMaxInvokeType + 1] = {}; + size_t virtual_made_direct_[kMaxInvokeType + 1] = {}; + size_t direct_calls_to_boot_[kMaxInvokeType + 1] = {}; + size_t direct_methods_to_boot_[kMaxInvokeType + 1] = {}; - size_t safe_casts_; - size_t not_safe_casts_; + size_t safe_casts_ = 0u; + size_t not_safe_casts_ = 0u; + + size_t class_status_count_[static_cast<size_t>(ClassStatus::kLast) + 1] = {}; DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats); }; @@ -2102,8 +2108,11 @@ class InitializeClassVisitor : public CompilationVisitor { Handle<mirror::Class> klass( hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader))); - if (klass != nullptr && !SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) { - TryInitializeClass(klass, class_loader); + if (klass != nullptr) { + if (!SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) { + TryInitializeClass(klass, class_loader); + } + manager_->GetCompiler()->stats_->AddClassStatus(klass->GetStatus()); } // Clear any class not found or verification exceptions. soa.Self()->ClearException(); |