Index: src/heap.cc |
=================================================================== |
--- src/heap.cc (revision 10502) |
+++ src/heap.cc (working copy) |
@@ -902,7 +902,8 @@ |
CompletelyClearInstanceofCache(); |
- FlushNumberStringCache(); |
+ // TODO(1605) select heuristic for flushing NumberString cache with |
+ // FlushNumberStringCache |
if (FLAG_cleanup_code_caches_at_gc) { |
polymorphic_code_cache()->set_cache(undefined_value()); |
} |
@@ -2511,10 +2512,7 @@ |
} |
set_intrinsic_function_names(StringDictionary::cast(obj)); |
- { MaybeObject* maybe_obj = AllocateInitialNumberStringCache(); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_number_string_cache(FixedArray::cast(obj)); |
+ if (InitializeNumberStringCache()->IsFailure()) return false; |
// Allocate cache for single character ASCII strings. |
{ MaybeObject* maybe_obj = |
@@ -2624,44 +2622,20 @@ |
} |
-MaybeObject* Heap::AllocateInitialNumberStringCache() { |
+MaybeObject* Heap::InitializeNumberStringCache() { |
+ // Compute the size of the number string cache based on the max heap size. |
+ // max_semispace_size_ == 512 KB => number_string_cache_size = 32. |
+ // 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; |
MaybeObject* maybe_obj = |
- AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED); |
+ AllocateFixedArray(number_string_cache_size * 2, TENURED); |
+ if (maybe_obj->ToObject(&obj)) set_number_string_cache(FixedArray::cast(obj)); |
return maybe_obj; |
} |
-int Heap::FullSizeNumberStringCacheLength() { |
- // Compute the size of the number string cache based on the max newspace size. |
- // The number string cache has a minimum size based on twice the initial cache |
- // size to ensure that it is bigger after being made 'full size'. |
- int number_string_cache_size = max_semispace_size_ / 512; |
- number_string_cache_size = Max(kInitialNumberStringCacheSize * 2, |
- Min(0x4000, number_string_cache_size)); |
- // There is a string and a number per entry so the length is twice the number |
- // of entries. |
- 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(FullSizeNumberStringCacheLength(), TENURED); |
- Object* new_cache; |
- if (maybe_obj->ToObject(&new_cache)) { |
- // We don't bother to repopulate the cache with entries from the old cache. |
- // It will be repopulated soon enough with new strings. |
- set_number_string_cache(FixedArray::cast(new_cache)); |
- } |
- // If allocation fails then we just return without doing anything. It is only |
- // a cache, so best effort is OK here. |
-} |
- |
- |
void Heap::FlushNumberStringCache() { |
// Flush the number to string cache. |
int len = number_string_cache()->length(); |
@@ -2707,17 +2681,11 @@ |
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); |
} |