Reviewers: ager_google.com,

Description:
Don't put the bits left over in pages on the free list when deserializing.
This is intended to improve code and data locality.

Please review this at http://codereview.chromium.org/3066035/show

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
  M     src/serialize.h
  M     src/serialize.cc


Index: src/serialize.cc
===================================================================
--- src/serialize.cc    (revision 5165)
+++ src/serialize.cc    (working copy)
@@ -919,6 +919,18 @@
                 0,
                 kUnknownOffsetFromStart)

+      case kByteArray: {
+        int space_number = source_->Get();
+        ASSIGN_DEST_SPACE(space_number);
+        int size = source_->GetInt();
+        Address address = Allocate(space_number, dest_space, size);
+        ByteArray* byte_array =
+            reinterpret_cast<ByteArray*>(HeapObject::FromAddress(address));
+        byte_array->set_map(Heap::raw_unchecked_byte_array_map());
+        byte_array->set_length(ByteArray::LengthFor(size));
+        break;
+      }
+
 #undef CASE_STATEMENT
 #undef CASE_BODY
 #undef ONE_PER_SPACE
@@ -1258,6 +1270,8 @@
 void Serializer::ObjectSerializer::Serialize() {
   int space = Serializer::SpaceOfObject(object_);
   int size = object_->Size();
+  bool start_new_page;
+  int offset = serializer_->Allocate(space, size, &start_new_page);

   sink_->Put(kNewObject + reference_representation_ + space,
              "ObjectSerialization");
@@ -1266,8 +1280,6 @@
   LOG(SnapshotPositionEvent(object_->address(), sink_->Position()));

   // Mark this object as already serialized.
-  bool start_new_page;
-  int offset = serializer_->Allocate(space, size, &start_new_page);
   serializer_->address_mapper()->AddMapping(object_, offset);
   if (start_new_page) {
     sink_->Put(kNewPage, "NewPage");
@@ -1453,6 +1465,16 @@
     int used_in_this_page = (fullness_[space] & (Page::kPageSize - 1));
     CHECK(size <= Page::kObjectAreaSize);
     if (used_in_this_page + size > Page::kObjectAreaSize) {
+      int padding_size = Page::kObjectAreaSize - used_in_this_page;
+      // We output padding at the end of each page in order to avoid the
+      // little bits of memory left by deserialization being put on the
+      // free list and spreading out subsequently allocated objects over
+      // many pages, causing poor locality of reference.
+      if (padding_size > ByteArray::kHeaderSize) {
+        sink_->Put(kByteArray, "Padding");
+        sink_->Put(space, "Space");
+ sink_->PutInt(Page::kObjectAreaSize - used_in_this_page, "PaddingSize");
+      }
       *new_page = true;
       fullness_[space] = RoundUp(fullness_[space], Page::kPageSize);
     }
Index: src/serialize.h
===================================================================
--- src/serialize.h     (revision 5165)
+++ src/serialize.h     (working copy)
@@ -228,7 +228,8 @@
   // is referred to from external strings in the snapshot.
   static const int kNativesStringResource = 0x71;
   static const int kNewPage = 0x72;
-  // 0x73-0x7f                            Free.
+  static const int kByteArray = 0x73;
+  // 0x74-0x7f                            Free.
   // 0xb0-0xbf                            Free.
   // 0xf0-0xff                            Free.



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

Reply via email to