diff options
| author | 2014-09-25 11:46:46 -0700 | |
|---|---|---|
| committer | 2014-09-25 15:53:54 -0700 | |
| commit | f0edfc355893d53d1104b05501c99ad5ccf305c4 (patch) | |
| tree | 7e1fa49875759512f5d02b1c45435d3e3366b920 /runtime/entrypoints/entrypoint_utils.cc | |
| parent | 1ed5b27ee329208fd8ae22b8a9a61d708e2c1ffb (diff) | |
Some optimizations for the array alloc path.
- Force Array::Alloc() to be inlined.
- Simplify the array size overflow check.
- Turn fill_usable into a template parameter.
- Remove a branch in Array::DataOffset() and avoid
Primitive::ComponentSize(), which has a switch, in the array alloc
path.
- Strength reductions in the array size computation by using component
size shifts instead of component sizes. Store component size shift
in the upper 16 bits of primitive_type field.
- Speedup: ~4% (3435->3284) in MemAllocTest on N4.
Bug: 9986565
Change-Id: I4b142ffac4ab8b5b915836f1660a949d6442344c
Diffstat (limited to 'runtime/entrypoints/entrypoint_utils.cc')
| -rw-r--r-- | runtime/entrypoints/entrypoint_utils.cc | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/runtime/entrypoints/entrypoint_utils.cc b/runtime/entrypoints/entrypoint_utils.cc index a78c2c005b..835d6e2b7e 100644 --- a/runtime/entrypoints/entrypoint_utils.cc +++ b/runtime/entrypoints/entrypoint_utils.cc @@ -90,7 +90,8 @@ mirror::Array* CheckAndAllocArrayFromCode(uint32_t type_idx, mirror::ArtMethod* gc::Heap* heap = Runtime::Current()->GetHeap(); // Use the current allocator type in case CheckFilledNewArrayAlloc caused us to suspend and then // the heap switched the allocator type while we were suspended. - return mirror::Array::Alloc<false>(self, klass, component_count, klass->GetComponentSize(), + return mirror::Array::Alloc<false>(self, klass, component_count, + klass->GetComponentSizeShift(), heap->GetCurrentAllocator()); } @@ -109,7 +110,8 @@ mirror::Array* CheckAndAllocArrayFromCodeInstrumented(uint32_t type_idx, gc::Heap* heap = Runtime::Current()->GetHeap(); // Use the current allocator type in case CheckFilledNewArrayAlloc caused us to suspend and then // the heap switched the allocator type while we were suspended. - return mirror::Array::Alloc<true>(self, klass, component_count, klass->GetComponentSize(), + return mirror::Array::Alloc<true>(self, klass, component_count, + klass->GetComponentSizeShift(), heap->GetCurrentAllocator()); } |