Chromium Code Reviews| Index: src/heap.cc |
| =================================================================== |
| --- src/heap.cc (revision 10495) |
| +++ src/heap.cc (working copy) |
| @@ -896,8 +896,7 @@ |
| CompletelyClearInstanceofCache(); |
| - // TODO(1605) select heuristic for flushing NumberString cache with |
| - // FlushNumberStringCache |
| + FlushNumberStringCache(); |
|
Michael Starzinger
2012/01/25 13:00:56
If it's intentional that the new heuristic for flu
Erik Corry
2012/01/25 14:37:26
Done.
|
| if (FLAG_cleanup_code_caches_at_gc) { |
| polymorphic_code_cache()->set_cache(undefined_value()); |
| } |
| @@ -2506,7 +2505,10 @@ |
| } |
| set_intrinsic_function_names(StringDictionary::cast(obj)); |
| - if (InitializeNumberStringCache()->IsFailure()) return false; |
| + { MaybeObject* maybe_obj = AllocateInitialNumberStringCache(); |
| + if (!maybe_obj->ToObject(&obj)) return false; |
| + } |
| + set_number_string_cache(FixedArray::cast(obj)); |
| // Allocate cache for single character ASCII strings. |
| { MaybeObject* maybe_obj = |
| @@ -2616,17 +2618,35 @@ |
| } |
| -MaybeObject* Heap::InitializeNumberStringCache() { |
| +MaybeObject* Heap::AllocateInitialNumberStringCache() { |
| + MaybeObject* maybe_obj = |
| + AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED); |
| + return maybe_obj; |
| +} |
| + |
| + |
| +int Heap::FullSizeNumberStringCacheLength() { |
| // Compute the size of the number string cache based on the max heap size. |
| // max_semispace_size_ == 512 KB => number_string_cache_size = 32. |
|
Michael Starzinger
2012/01/25 13:00:56
This comment no longer is on sync with the computa
Erik Corry
2012/01/25 14:37:26
Done.
|
| // max_semispace_size_ == 8 MB => number_string_cache_size = 16KB. |
| int number_string_cache_size = max_semispace_size_ / 512; |
| - number_string_cache_size = Max(32, Min(16*KB, number_string_cache_size)); |
| - Object* obj; |
| + number_string_cache_size = Max(kInitialNumberStringCacheSize * 2, |
|
Michael Starzinger
2012/01/25 13:00:56
The constant is multiplied with 2 twice. I think w
Erik Corry
2012/01/25 14:37:26
The first multiplication is there to ensure that t
|
| + Min(16*KB, number_string_cache_size)); |
| + return number_string_cache_size * 2; |
| +} |
| + |
| + |
| +void Heap::AllocateFullSizeNumberStringCache() { |
| + // The idea is to have a small number string cache in the snapshot to keep |
| + // boot-time memory usage down. If we expand the number string cache already |
| + // while creating the snapshot then that didn't work out. |
| + ASSERT(!Serializer::enabled()); |
| MaybeObject* maybe_obj = |
| - AllocateFixedArray(number_string_cache_size * 2, TENURED); |
| - if (maybe_obj->ToObject(&obj)) set_number_string_cache(FixedArray::cast(obj)); |
| - return maybe_obj; |
| + AllocateFixedArray(FullSizeNumberStringCacheLength(), TENURED); |
| + Object* new_cache; |
| + if (maybe_obj->ToObject(&new_cache)) { |
|
Michael Starzinger
2012/01/25 13:00:56
Can we add a comment that this is a best effort al
Erik Corry
2012/01/25 14:37:26
Done.
|
| + set_number_string_cache(FixedArray::cast(new_cache)); |
| + } |
| } |
| @@ -2675,11 +2695,17 @@ |
| int mask = (number_string_cache()->length() >> 1) - 1; |
| if (number->IsSmi()) { |
| hash = smi_get_hash(Smi::cast(number)) & mask; |
| - number_string_cache()->set(hash * 2, Smi::cast(number)); |
| } else { |
| hash = double_get_hash(number->Number()) & mask; |
| - number_string_cache()->set(hash * 2, number); |
| } |
| + if (number_string_cache()->get(hash * 2) != undefined_value() && |
| + number_string_cache()->length() != FullSizeNumberStringCacheLength()) { |
| + // The first time we have a hash collision, we move to the full sized |
| + // number string cache. |
| + AllocateFullSizeNumberStringCache(); |
| + return; |
| + } |
| + number_string_cache()->set(hash * 2, number); |
| number_string_cache()->set(hash * 2 + 1, string); |
| } |