Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: src/spaces.cc

Issue 9634005: Implement a hash based look-up to speed up containing address check in large (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/spaces.h ('K') | « src/spaces.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/spaces.cc
===================================================================
--- src/spaces.cc (revision 10961)
+++ src/spaces.cc (working copy)
@@ -2520,6 +2520,9 @@
// -----------------------------------------------------------------------------
// LargeObjectSpace
+static bool match(void* key1, void* key2) {
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 Please give this function a more meaningful name,
kewpie.w.zp 2012/03/12 02:00:40 Done.
+ return key1 == key2;
+}
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 one additional empty line
kewpie.w.zp 2012/03/12 02:00:40 Done.
LargeObjectSpace::LargeObjectSpace(Heap* heap,
intptr_t max_capacity,
@@ -2529,7 +2532,8 @@
first_page_(NULL),
size_(0),
page_count_(0),
- objects_size_(0) {}
+ objects_size_(0),
+ map_(match, 1024) {}
bool LargeObjectSpace::SetUp() {
@@ -2537,6 +2541,7 @@
size_ = 0;
page_count_ = 0;
objects_size_ = 0;
+ map_.Clear();
return true;
}
@@ -2580,6 +2585,17 @@
page->set_next_page(first_page_);
first_page_ = page;
+ // map following entries to this page object, in which keys are
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 comments should start with a capital letter and en
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 I would rephrase this comment, for example: // Re
kewpie.w.zp 2012/03/12 02:00:40 Done.
+ // MemoryChunk::kAlignment-aligned addresses in this page, and
+ // hash is key/MemoryChunk::kAlignment to reduce hash conflict
+ uint32_t key = reinterpret_cast<uint32_t>(page);
+ uint32_t limit = key + page->size();
+ for (uint32_t hash = key/MemoryChunk::kAlignment;
+ key < limit;
+ key += MemoryChunk::kAlignment, hash++) {
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 I think you can just unify hash and key (make key
kewpie.w.zp 2012/03/12 02:00:40 Done.
+ (map_.Lookup(reinterpret_cast<void*>(key), hash, true))->value = page;
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 I would prefer this is done in two lines instead o
kewpie.w.zp 2012/03/12 02:00:40 Done.
+ }
+
HeapObject* object = page->GetObject();
#ifdef DEBUG
@@ -2596,33 +2612,39 @@
// GC support
MaybeObject* LargeObjectSpace::FindObject(Address a) {
- for (LargePage* page = first_page_;
- page != NULL;
- page = page->next_page()) {
+ uint32_t key = reinterpret_cast<uint32_t>(a);
+ key -= key % MemoryChunk::kAlignment;
+ uint32_t hash = key / MemoryChunk::kAlignment;
+ HashMap::Entry* e = map_.Lookup(reinterpret_cast<void*>(key), hash, false);
+ if ( e != NULL ) {
+ ASSERT(e->value != NULL);
+ LargePage* page = reinterpret_cast<LargePage*>(e->value);
+ ASSERT(page->is_valid());
Address page_address = page->address();
- if (page_address <= a && a < page_address + page->size()) {
+ if ( page_address <= a && a < page_address + page->size() ) {
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 accidental edit? please revert.
kewpie.w.zp 2012/03/12 02:00:40 Done.
return page->GetObject();
}
}
return Failure::Exception();
}
-
LargePage* LargeObjectSpace::FindPageContainingPc(Address pc) {
- // TODO(853): Change this implementation to only find executable
- // chunks and use some kind of hash-based approach to speed it up.
- for (LargePage* chunk = first_page_;
- chunk != NULL;
- chunk = chunk->next_page()) {
- Address chunk_address = chunk->address();
- if (chunk_address <= pc && pc < chunk_address + chunk->size()) {
- return chunk;
+ uint32_t key = reinterpret_cast<uint32_t>(pc);
+ key -= key % MemoryChunk::kAlignment;
+ uint32_t hash = key / MemoryChunk::kAlignment;
+ HashMap::Entry* e = map_.Lookup(reinterpret_cast<void*>(key), hash, false);
+ if ( e != NULL ) {
+ ASSERT(e->value != NULL);
+ LargePage* page = reinterpret_cast<LargePage*>(e->value);
+ ASSERT(page->is_valid());
+ Address page_address = page->address();
+ if ( page_address <= pc && pc < page_address + page->size() ) {
+ return page;
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 This code is duplicated in two places. Please move
kewpie.w.zp 2012/03/12 02:00:40 Accepted, will reduce FindObject(a) size by callin
}
}
return NULL;
}
-
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 accidental edit? please revert.
kewpie.w.zp 2012/03/12 02:00:40 Done.
void LargeObjectSpace::FreeUnmarkedObjects() {
LargePage* previous = NULL;
LargePage* current = first_page_;
@@ -2654,6 +2676,15 @@
objects_size_ -= object->Size();
page_count_--;
+ // remove entries belonging to this page
Vyacheslav Egorov (Chromium) 2012/03/08 11:41:23 comments should start with a capital letter and en
kewpie.w.zp 2012/03/12 02:00:40 Done.
+ uint32_t key = reinterpret_cast<uint32_t>(page);
+ uint32_t limit = key + page->size();
+ for (uint32_t hash = key/MemoryChunk::kAlignment;
+ key < limit;
+ key += MemoryChunk::kAlignment, hash++) {
+ map_.Remove(reinterpret_cast<void*>(key), hash);
+ }
+
if (is_pointer_object) {
heap()->QueueMemoryChunkForFree(page);
} else {
« src/spaces.h ('K') | « src/spaces.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698