diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-10-23 16:48:06 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-10-27 16:49:43 -0700 |
commit | 2d2621a1463d2f3f03fa73503fa42e43657cdcfc (patch) | |
tree | 1f7cf393693d72db5c186f99b04ac511958c6418 /runtime/gc/heap.h | |
parent | ac293277b69882105810fabd6c53f55de58823fe (diff) | |
download | art-2d2621a1463d2f3f03fa73503fa42e43657cdcfc.tar.gz art-2d2621a1463d2f3f03fa73503fa42e43657cdcfc.tar.bz2 art-2d2621a1463d2f3f03fa73503fa42e43657cdcfc.zip |
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<art::mirror::Class>)
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
Diffstat (limited to 'runtime/gc/heap.h')
-rw-r--r-- | runtime/gc/heap.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h index ff1e38b91a..7b891a61ac 100644 --- a/runtime/gc/heap.h +++ b/runtime/gc/heap.h @@ -382,18 +382,18 @@ class Heap { // Must be called if a field of an Object in the heap changes, and before any GC safe-point. // The call is not needed if NULL is stored in the field. - void WriteBarrierField(const mirror::Object* dst, MemberOffset /*offset*/, - const mirror::Object* /*new_value*/) { + ALWAYS_INLINE void WriteBarrierField(const mirror::Object* dst, MemberOffset /*offset*/, + const mirror::Object* /*new_value*/) { card_table_->MarkCard(dst); } // Write barrier for array operations that update many field positions - void WriteBarrierArray(const mirror::Object* dst, int /*start_offset*/, - size_t /*length TODO: element_count or byte_count?*/) { + ALWAYS_INLINE void WriteBarrierArray(const mirror::Object* dst, int /*start_offset*/, + size_t /*length TODO: element_count or byte_count?*/) { card_table_->MarkCard(dst); } - void WriteBarrierEveryFieldOf(const mirror::Object* obj) { + ALWAYS_INLINE void WriteBarrierEveryFieldOf(const mirror::Object* obj) { card_table_->MarkCard(obj); } |