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

Side by Side Diff: src/hashmap.h

Issue 10870033: Make the performance of the VM more predictable by not letting the hash seed (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/scopes.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 AllocationPolicy allocator = AllocationPolicy()); 52 AllocationPolicy allocator = AllocationPolicy());
53 53
54 ~TemplateHashMapImpl(); 54 ~TemplateHashMapImpl();
55 55
56 // HashMap entries are (key, value, hash) triplets. 56 // HashMap entries are (key, value, hash) triplets.
57 // Some clients may not need to use the value slot 57 // Some clients may not need to use the value slot
58 // (e.g. implementers of sets, where the key is the value). 58 // (e.g. implementers of sets, where the key is the value).
59 struct Entry { 59 struct Entry {
60 void* key; 60 void* key;
61 void* value; 61 void* value;
62 uint32_t hash; // the full hash value for key 62 uint32_t hash; // The full hash value for key
63 int order; // If you never remove entries this is the insertion order.
63 }; 64 };
64 65
65 // If an entry with matching key is found, Lookup() 66 // If an entry with matching key is found, Lookup()
66 // returns that entry. If no matching entry is found, 67 // returns that entry. If no matching entry is found,
67 // but insert is set, a new entry is inserted with 68 // but insert is set, a new entry is inserted with
68 // corresponding key, key hash, and NULL value. 69 // corresponding key, key hash, and NULL value.
69 // Otherwise, NULL is returned. 70 // Otherwise, NULL is returned.
70 Entry* Lookup(void* key, uint32_t hash, bool insert, 71 Entry* Lookup(void* key, uint32_t hash, bool insert,
71 AllocationPolicy allocator = AllocationPolicy()); 72 AllocationPolicy allocator = AllocationPolicy());
72 73
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 Entry* p = Probe(key, hash); 134 Entry* p = Probe(key, hash);
134 if (p->key != NULL) { 135 if (p->key != NULL) {
135 return p; 136 return p;
136 } 137 }
137 138
138 // No entry found; insert one if necessary. 139 // No entry found; insert one if necessary.
139 if (insert) { 140 if (insert) {
140 p->key = key; 141 p->key = key;
141 p->value = NULL; 142 p->value = NULL;
142 p->hash = hash; 143 p->hash = hash;
144 p->order = occupancy_;
143 occupancy_++; 145 occupancy_++;
144 146
145 // Grow the map if we reached >= 80% occupancy. 147 // Grow the map if we reached >= 80% occupancy.
146 if (occupancy_ + occupancy_/4 >= capacity_) { 148 if (occupancy_ + occupancy_/4 >= capacity_) {
147 Resize(allocator); 149 Resize(allocator);
148 p = Probe(key, hash); 150 p = Probe(key, hash);
149 } 151 }
150 152
151 return p; 153 return p;
152 } 154 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 void TemplateHashMapImpl<AllocationPolicy>::Resize(AllocationPolicy allocator) { 292 void TemplateHashMapImpl<AllocationPolicy>::Resize(AllocationPolicy allocator) {
291 Entry* map = map_; 293 Entry* map = map_;
292 uint32_t n = occupancy_; 294 uint32_t n = occupancy_;
293 295
294 // Allocate larger map. 296 // Allocate larger map.
295 Initialize(capacity_ * 2, allocator); 297 Initialize(capacity_ * 2, allocator);
296 298
297 // Rehash all current entries. 299 // Rehash all current entries.
298 for (Entry* p = map; n > 0; p++) { 300 for (Entry* p = map; n > 0; p++) {
299 if (p->key != NULL) { 301 if (p->key != NULL) {
300 Lookup(p->key, p->hash, true, allocator)->value = p->value; 302 Entry* entry = Lookup(p->key, p->hash, true, allocator);
303 entry->value = p->value;
304 entry->order = p->order;
301 n--; 305 n--;
302 } 306 }
303 } 307 }
304 308
305 // Delete old map. 309 // Delete old map.
306 AllocationPolicy::Delete(map); 310 AllocationPolicy::Delete(map);
307 } 311 }
308 312
309 313
310 // A hash map for pointer keys and values with an STL-like interface. 314 // A hash map for pointer keys and values with an STL-like interface.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 Iterator end() const { return Iterator(this, NULL); } 355 Iterator end() const { return Iterator(this, NULL); }
352 Iterator find(Key* key, bool insert = false, 356 Iterator find(Key* key, bool insert = false,
353 AllocationPolicy allocator = AllocationPolicy()) { 357 AllocationPolicy allocator = AllocationPolicy()) {
354 return Iterator(this, this->Lookup(key, key->Hash(), insert, allocator)); 358 return Iterator(this, this->Lookup(key, key->Hash(), insert, allocator));
355 } 359 }
356 }; 360 };
357 361
358 } } // namespace v8::internal 362 } } // namespace v8::internal
359 363
360 #endif // V8_HASHMAP_H_ 364 #endif // V8_HASHMAP_H_
OLDNEW
« no previous file with comments | « no previous file | src/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698