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

Side by Side Diff: src/heap.cc

Issue 9235029: Flush number string cache on GC (bug 1605). Also start with a small (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 11 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
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 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 // maps. 889 // maps.
890 isolate_->keyed_lookup_cache()->Clear(); 890 isolate_->keyed_lookup_cache()->Clear();
891 isolate_->context_slot_cache()->Clear(); 891 isolate_->context_slot_cache()->Clear();
892 isolate_->descriptor_lookup_cache()->Clear(); 892 isolate_->descriptor_lookup_cache()->Clear();
893 StringSplitCache::Clear(string_split_cache()); 893 StringSplitCache::Clear(string_split_cache());
894 894
895 isolate_->compilation_cache()->MarkCompactPrologue(); 895 isolate_->compilation_cache()->MarkCompactPrologue();
896 896
897 CompletelyClearInstanceofCache(); 897 CompletelyClearInstanceofCache();
898 898
899 // TODO(1605) select heuristic for flushing NumberString cache with 899 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.
900 // FlushNumberStringCache
901 if (FLAG_cleanup_code_caches_at_gc) { 900 if (FLAG_cleanup_code_caches_at_gc) {
902 polymorphic_code_cache()->set_cache(undefined_value()); 901 polymorphic_code_cache()->set_cache(undefined_value());
903 } 902 }
904 903
905 ClearNormalizedMapCaches(); 904 ClearNormalizedMapCaches();
906 } 905 }
907 906
908 907
909 Object* Heap::FindCodeObject(Address a) { 908 Object* Heap::FindCodeObject(Address a) {
910 return isolate()->inner_pointer_to_code_cache()-> 909 return isolate()->inner_pointer_to_code_cache()->
(...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after
2499 // Allocate the dictionary of intrinsic function names. 2498 // Allocate the dictionary of intrinsic function names.
2500 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions); 2499 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions);
2501 if (!maybe_obj->ToObject(&obj)) return false; 2500 if (!maybe_obj->ToObject(&obj)) return false;
2502 } 2501 }
2503 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this, 2502 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this,
2504 obj); 2503 obj);
2505 if (!maybe_obj->ToObject(&obj)) return false; 2504 if (!maybe_obj->ToObject(&obj)) return false;
2506 } 2505 }
2507 set_intrinsic_function_names(StringDictionary::cast(obj)); 2506 set_intrinsic_function_names(StringDictionary::cast(obj));
2508 2507
2509 if (InitializeNumberStringCache()->IsFailure()) return false; 2508 { MaybeObject* maybe_obj = AllocateInitialNumberStringCache();
2509 if (!maybe_obj->ToObject(&obj)) return false;
2510 }
2511 set_number_string_cache(FixedArray::cast(obj));
2510 2512
2511 // Allocate cache for single character ASCII strings. 2513 // Allocate cache for single character ASCII strings.
2512 { MaybeObject* maybe_obj = 2514 { MaybeObject* maybe_obj =
2513 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); 2515 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED);
2514 if (!maybe_obj->ToObject(&obj)) return false; 2516 if (!maybe_obj->ToObject(&obj)) return false;
2515 } 2517 }
2516 set_single_character_string_cache(FixedArray::cast(obj)); 2518 set_single_character_string_cache(FixedArray::cast(obj));
2517 2519
2518 // Allocate cache for string split. 2520 // Allocate cache for string split.
2519 { MaybeObject* maybe_obj = 2521 { MaybeObject* maybe_obj =
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 } 2611 }
2610 2612
2611 2613
2612 void StringSplitCache::Clear(FixedArray* cache) { 2614 void StringSplitCache::Clear(FixedArray* cache) {
2613 for (int i = 0; i < kStringSplitCacheSize; i++) { 2615 for (int i = 0; i < kStringSplitCacheSize; i++) {
2614 cache->set(i, Smi::FromInt(0)); 2616 cache->set(i, Smi::FromInt(0));
2615 } 2617 }
2616 } 2618 }
2617 2619
2618 2620
2619 MaybeObject* Heap::InitializeNumberStringCache() { 2621 MaybeObject* Heap::AllocateInitialNumberStringCache() {
2622 MaybeObject* maybe_obj =
2623 AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED);
2624 return maybe_obj;
2625 }
2626
2627
2628 int Heap::FullSizeNumberStringCacheLength() {
2620 // Compute the size of the number string cache based on the max heap size. 2629 // Compute the size of the number string cache based on the max heap size.
2621 // max_semispace_size_ == 512 KB => number_string_cache_size = 32. 2630 // 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.
2622 // max_semispace_size_ == 8 MB => number_string_cache_size = 16KB. 2631 // max_semispace_size_ == 8 MB => number_string_cache_size = 16KB.
2623 int number_string_cache_size = max_semispace_size_ / 512; 2632 int number_string_cache_size = max_semispace_size_ / 512;
2624 number_string_cache_size = Max(32, Min(16*KB, number_string_cache_size)); 2633 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
2625 Object* obj; 2634 Min(16*KB, number_string_cache_size));
2626 MaybeObject* maybe_obj = 2635 return number_string_cache_size * 2;
2627 AllocateFixedArray(number_string_cache_size * 2, TENURED);
2628 if (maybe_obj->ToObject(&obj)) set_number_string_cache(FixedArray::cast(obj));
2629 return maybe_obj;
2630 } 2636 }
2631 2637
2632 2638
2639 void Heap::AllocateFullSizeNumberStringCache() {
2640 // The idea is to have a small number string cache in the snapshot to keep
2641 // boot-time memory usage down. If we expand the number string cache already
2642 // while creating the snapshot then that didn't work out.
2643 ASSERT(!Serializer::enabled());
2644 MaybeObject* maybe_obj =
2645 AllocateFixedArray(FullSizeNumberStringCacheLength(), TENURED);
2646 Object* new_cache;
2647 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.
2648 set_number_string_cache(FixedArray::cast(new_cache));
2649 }
2650 }
2651
2652
2633 void Heap::FlushNumberStringCache() { 2653 void Heap::FlushNumberStringCache() {
2634 // Flush the number to string cache. 2654 // Flush the number to string cache.
2635 int len = number_string_cache()->length(); 2655 int len = number_string_cache()->length();
2636 for (int i = 0; i < len; i++) { 2656 for (int i = 0; i < len; i++) {
2637 number_string_cache()->set_undefined(this, i); 2657 number_string_cache()->set_undefined(this, i);
2638 } 2658 }
2639 } 2659 }
2640 2660
2641 2661
2642 static inline int double_get_hash(double d) { 2662 static inline int double_get_hash(double d) {
(...skipping 25 matching lines...) Expand all
2668 } 2688 }
2669 return undefined_value(); 2689 return undefined_value();
2670 } 2690 }
2671 2691
2672 2692
2673 void Heap::SetNumberStringCache(Object* number, String* string) { 2693 void Heap::SetNumberStringCache(Object* number, String* string) {
2674 int hash; 2694 int hash;
2675 int mask = (number_string_cache()->length() >> 1) - 1; 2695 int mask = (number_string_cache()->length() >> 1) - 1;
2676 if (number->IsSmi()) { 2696 if (number->IsSmi()) {
2677 hash = smi_get_hash(Smi::cast(number)) & mask; 2697 hash = smi_get_hash(Smi::cast(number)) & mask;
2678 number_string_cache()->set(hash * 2, Smi::cast(number));
2679 } else { 2698 } else {
2680 hash = double_get_hash(number->Number()) & mask; 2699 hash = double_get_hash(number->Number()) & mask;
2681 number_string_cache()->set(hash * 2, number);
2682 } 2700 }
2701 if (number_string_cache()->get(hash * 2) != undefined_value() &&
2702 number_string_cache()->length() != FullSizeNumberStringCacheLength()) {
2703 // The first time we have a hash collision, we move to the full sized
2704 // number string cache.
2705 AllocateFullSizeNumberStringCache();
2706 return;
2707 }
2708 number_string_cache()->set(hash * 2, number);
2683 number_string_cache()->set(hash * 2 + 1, string); 2709 number_string_cache()->set(hash * 2 + 1, string);
2684 } 2710 }
2685 2711
2686 2712
2687 MaybeObject* Heap::NumberToString(Object* number, 2713 MaybeObject* Heap::NumberToString(Object* number,
2688 bool check_number_string_cache) { 2714 bool check_number_string_cache) {
2689 isolate_->counters()->number_to_string_runtime()->Increment(); 2715 isolate_->counters()->number_to_string_runtime()->Increment();
2690 if (check_number_string_cache) { 2716 if (check_number_string_cache) {
2691 Object* cached = GetNumberStringCache(number); 2717 Object* cached = GetNumberStringCache(number);
2692 if (cached != undefined_value()) { 2718 if (cached != undefined_value()) {
(...skipping 3994 matching lines...) Expand 10 before | Expand all | Expand 10 after
6687 isolate_->heap()->store_buffer()->Compact(); 6713 isolate_->heap()->store_buffer()->Compact();
6688 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); 6714 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED);
6689 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 6715 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) {
6690 next = chunk->next_chunk(); 6716 next = chunk->next_chunk();
6691 isolate_->memory_allocator()->Free(chunk); 6717 isolate_->memory_allocator()->Free(chunk);
6692 } 6718 }
6693 chunks_queued_for_free_ = NULL; 6719 chunks_queued_for_free_ = NULL;
6694 } 6720 }
6695 6721
6696 } } // namespace v8::internal 6722 } } // namespace v8::internal
OLDNEW
« src/heap.h ('K') | « src/heap.h ('k') | test/cctest/test-mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698