OSDN Git Service

Move StackMapStream deduplication maps to arena.
authorVladimir Marko <vmarko@google.com>
Wed, 22 Feb 2017 11:59:57 +0000 (11:59 +0000)
committerVladimir Marko <vmarko@google.com>
Wed, 22 Feb 2017 12:40:40 +0000 (12:40 +0000)
Measured compilation of a big app using heap track:
  bytes allocated in total (ignoring deallocations): 4.14GB -> 3.98GB
  calls to allocation functions: 21662554 -> 1016606

Test: testrunner.py --host
Bug: 34053922
Change-Id: I0b1c4b5273daa2bc35e039df246bafad417b9b2b

compiler/optimizing/stack_map_stream.cc
runtime/base/arena_containers.h

index eeae96e..4d12ad6 100644 (file)
@@ -16,8 +16,6 @@
 
 #include "stack_map_stream.h"
 
-#include <unordered_map>
-
 #include "art_method-inl.h"
 #include "base/stl_util.h"
 #include "optimizing/optimizing_compiler.h"
@@ -526,7 +524,7 @@ void StackMapStream::CheckDexRegisterMap(const CodeInfo& code_info,
 
 size_t StackMapStream::PrepareRegisterMasks() {
   register_masks_.resize(stack_maps_.size(), 0u);
-  std::unordered_map<uint32_t, size_t> dedupe;
+  ArenaUnorderedMap<uint32_t, size_t> dedupe(allocator_->Adapter(kArenaAllocStackMapStream));
   for (StackMapEntry& stack_map : stack_maps_) {
     const size_t index = dedupe.size();
     stack_map.register_mask_index = dedupe.emplace(stack_map.register_mask, index).first->second;
@@ -541,10 +539,11 @@ size_t StackMapStream::PrepareStackMasks(size_t entry_size_in_bits) {
   stack_masks_.resize(byte_entry_size * stack_maps_.size(), 0u);
   // For deduplicating we store the stack masks as byte packed for simplicity. We can bit pack later
   // when copying out from stack_masks_.
-  std::unordered_map<MemoryRegion,
-                     size_t,
-                     FNVHash<MemoryRegion>,
-                     MemoryRegion::ContentEquals> dedup(stack_maps_.size());
+  ArenaUnorderedMap<MemoryRegion,
+                    size_t,
+                    FNVHash<MemoryRegion>,
+                    MemoryRegion::ContentEquals> dedup(
+                        stack_maps_.size(), allocator_->Adapter(kArenaAllocStackMapStream));
   for (StackMapEntry& stack_map : stack_maps_) {
     size_t index = dedup.size();
     MemoryRegion stack_mask(stack_masks_.data() + index * byte_entry_size, byte_entry_size);
index 2c8aa28..62b974e 100644 (file)
@@ -21,6 +21,7 @@
 #include <queue>
 #include <set>
 #include <stack>
+#include <unordered_map>
 #include <utility>
 
 #include "arena_allocator.h"
@@ -85,6 +86,16 @@ using ArenaHashMap = HashMap<Key,
                              Pred,
                              ArenaAllocatorAdapter<std::pair<Key, Value>>>;
 
+template <typename Key,
+          typename Value,
+          typename Hash = std::hash<Key>,
+          typename Pred = std::equal_to<Value>>
+using ArenaUnorderedMap = std::unordered_map<Key,
+                                             Value,
+                                             Hash,
+                                             Pred,
+                                             ArenaAllocatorAdapter<std::pair<const Key, Value>>>;
+
 // Implementation details below.
 
 template <bool kCount>