Author: [email protected]
Date: Mon May 25 09:33:00 2009
New Revision: 2045

Modified:
    branches/bleeding_edge/src/heap.cc
    branches/bleeding_edge/src/heap.h
    branches/bleeding_edge/src/spaces.cc

Log:
- Introduce histograms collecting data about the number of set remembered  
set
   bits in a page.
Review URL: http://codereview.chromium.org/113819

Modified: branches/bleeding_edge/src/heap.cc
==============================================================================
--- branches/bleeding_edge/src/heap.cc  (original)
+++ branches/bleeding_edge/src/heap.cc  Mon May 25 09:33:00 2009
@@ -2664,12 +2664,13 @@
  #endif  // DEBUG


-void Heap::IterateRSetRange(Address object_start,
-                            Address object_end,
-                            Address rset_start,
-                            ObjectSlotCallback copy_object_func) {
+int Heap::IterateRSetRange(Address object_start,
+                           Address object_end,
+                           Address rset_start,
+                           ObjectSlotCallback copy_object_func) {
    Address object_address = object_start;
    Address rset_address = rset_start;
+  int set_bits_count = 0;

    // Loop over all the pointers in [object_start, object_end).
    while (object_address < object_end) {
@@ -2686,6 +2687,7 @@
            // If this pointer does not need to be remembered anymore, clear
            // the remembered set bit.
            if (!Heap::InNewSpace(*object_p)) result_rset &= ~bitmask;
+          set_bits_count++;
          }
          object_address += kPointerSize;
        }
@@ -2699,6 +2701,7 @@
      }
      rset_address += kIntSize;
    }
+  return set_bits_count;
  }


@@ -2706,11 +2709,20 @@
    ASSERT(Page::is_rset_in_use());
    ASSERT(space == old_pointer_space_ || space == map_space_);

+  static void* paged_rset_histogram = StatsTable::CreateHistogram(
+      "V8.RSetPaged",
+      0,
+      Page::kObjectAreaSize / kPointerSize,
+      30);
+
    PageIterator it(space, PageIterator::PAGES_IN_USE);
    while (it.has_next()) {
      Page* page = it.next();
-    IterateRSetRange(page->ObjectAreaStart(), page->AllocationTop(),
-                     page->RSetStart(), copy_object_func);
+    int count = IterateRSetRange(page->ObjectAreaStart(),  
page->AllocationTop(),
+                                 page->RSetStart(), copy_object_func);
+    if (paged_rset_histogram != NULL) {
+      StatsTable::AddHistogramSample(paged_rset_histogram, count);
+    }
    }
  }


Modified: branches/bleeding_edge/src/heap.h
==============================================================================
--- branches/bleeding_edge/src/heap.h   (original)
+++ branches/bleeding_edge/src/heap.h   Mon May 25 09:33:00 2009
@@ -667,10 +667,11 @@
    // Iterates a range of remembered set addresses starting with rset_start
    // corresponding to the range of allocated pointers
    // [object_start, object_end).
-  static void IterateRSetRange(Address object_start,
-                               Address object_end,
-                               Address rset_start,
-                               ObjectSlotCallback copy_object_func);
+  // Returns the number of bits that were set.
+  static int IterateRSetRange(Address object_start,
+                              Address object_end,
+                              Address rset_start,
+                              ObjectSlotCallback copy_object_func);

    // Returns whether the object resides in new space.
    static inline bool InNewSpace(Object* object);

Modified: branches/bleeding_edge/src/spaces.cc
==============================================================================
--- branches/bleeding_edge/src/spaces.cc        (original)
+++ branches/bleeding_edge/src/spaces.cc        Mon May 25 09:33:00 2009
@@ -2423,6 +2423,13 @@
  void LargeObjectSpace::IterateRSet(ObjectSlotCallback copy_object_func) {
    ASSERT(Page::is_rset_in_use());

+  static void* lo_rset_histogram = StatsTable::CreateHistogram(
+      "V8.RSetLO",
+      0,
+      // Keeping this histogram's buckets the same as the paged space  
histogram.
+      Page::kObjectAreaSize / kPointerSize,
+      30);
+
    LargeObjectIterator it(this);
    while (it.has_next()) {
      // We only have code, sequential strings, or fixed arrays in large
@@ -2433,15 +2440,18 @@
        // Iterate the normal page remembered set range.
        Page* page = Page::FromAddress(object->address());
        Address object_end = object->address() + object->Size();
-      Heap::IterateRSetRange(page->ObjectAreaStart(),
-                             Min(page->ObjectAreaEnd(), object_end),
-                             page->RSetStart(),
-                             copy_object_func);
+      int count = Heap::IterateRSetRange(page->ObjectAreaStart(),
+                                         Min(page->ObjectAreaEnd(),  
object_end),
+                                         page->RSetStart(),
+                                         copy_object_func);

        // Iterate the extra array elements.
        if (object_end > page->ObjectAreaEnd()) {
-        Heap::IterateRSetRange(page->ObjectAreaEnd(), object_end,
-                               object_end, copy_object_func);
+        count += Heap::IterateRSetRange(page->ObjectAreaEnd(), object_end,
+                                        object_end, copy_object_func);
+      }
+      if (lo_rset_histogram != NULL) {
+        StatsTable::AddHistogramSample(lo_rset_histogram, count);
        }
      }
    }

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to