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