From 2d2621a1463d2f3f03fa73503fa42e43657cdcfc Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 23 Oct 2014 16:48:06 -0700 Subject: Optimize method linking Added more inlining, removed imt array allocation and replaced it with a handle scope. Removed some un-necessary handle scopes. Added logic to base interface method tables from the superclass so that we dont need to reconstruct for every interface (large win). Facebook launch Dalvik KK MR2: TotalTime: 3165 TotalTime: 3652 TotalTime: 3143 TotalTime: 3298 TotalTime: 3212 TotalTime: 3211 Facebook launch TOT before: WaitTime: 3702 WaitTime: 3616 WaitTime: 3616 WaitTime: 3687 WaitTime: 3742 WaitTime: 3767 After optimizations: WaitTime: 2903 WaitTime: 2953 WaitTime: 2918 WaitTime: 2940 WaitTime: 2879 WaitTime: 2792 LinkInterfaceMethods no longer one of the hottest methods, new list: 4.73% art::ClassLinker::LinkVirtualMethods(art::Thread*, art::Handle) 3.07% art::DexFile::FindClassDef(char const*) const 2.94% art::mirror::Class::FindDeclaredStaticField(art::mirror::DexCache const*, unsigned int) 2.90% art::DexFile::FindStringId(char const*) const Bug: 18054905 Bug: 16828525 (cherry picked from commit 1fb463e42cf1d67595cff66d19c0f99e3046f4c4) Change-Id: I27cc70178fd3655fbe5a3178887fcba189d21321 --- runtime/handle_scope.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'runtime/handle_scope.h') diff --git a/runtime/handle_scope.h b/runtime/handle_scope.h index 13c939fc3c..beb7ee08b8 100644 --- a/runtime/handle_scope.h +++ b/runtime/handle_scope.h @@ -166,11 +166,11 @@ class HandleWrapper : public MutableHandle { template class PACKED(4) StackHandleScope FINAL : public HandleScope { public: - explicit StackHandleScope(Thread* self); - ~StackHandleScope(); + explicit ALWAYS_INLINE StackHandleScope(Thread* self, mirror::Object* fill_value = nullptr); + ALWAYS_INLINE ~StackHandleScope(); template - MutableHandle NewHandle(T* object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + ALWAYS_INLINE MutableHandle NewHandle(T* object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { SetReference(pos_, object); MutableHandle h(GetHandle(pos_)); pos_++; @@ -178,25 +178,25 @@ class PACKED(4) StackHandleScope FINAL : public HandleScope { } template - HandleWrapper NewHandleWrapper(T** object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + ALWAYS_INLINE HandleWrapper NewHandleWrapper(T** object) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { SetReference(pos_, *object); MutableHandle h(GetHandle(pos_)); pos_++; return HandleWrapper(object, h); } - private: - template - ALWAYS_INLINE MutableHandle GetHandle(size_t i) + ALWAYS_INLINE void SetReference(size_t i, mirror::Object* object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK_LT(i, kNumReferences); - return MutableHandle(&GetReferences()[i]); + GetReferences()[i].Assign(object); } - ALWAYS_INLINE void SetReference(size_t i, mirror::Object* object) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + private: + template + ALWAYS_INLINE MutableHandle GetHandle(size_t i) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK_LT(i, kNumReferences); - GetReferences()[i].Assign(object); + return MutableHandle(&GetReferences()[i]); } // Reference storage needs to be first as expected by the HandleScope layout. -- cgit v1.2.3