A page created a number of ConsStrings that refer to one big string.

Each such string requires small amount of heap memory.
Heap snapshot generator copies all the strings into internal hash map for future use.
The each copy requires much more memory than original v8 string.

I made a workaround for this. The snapshot will copy only first 1024 symbols.
A simple drive-by fix was made for a performance problem in ToCString implementation.

BUG=v8:1816
TEST=none

Review URL: http://codereview.chromium.org/8509003
Patch from Ilya Tikhonovsky <loislo@chromium.org>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9928 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 034eb173
......@@ -5826,12 +5826,9 @@ SmartArrayPointer<char> String::ToCString(AllowNullsFlag allow_nulls,
buffer->Reset(offset, this);
int character_position = offset;
int utf8_bytes = 0;
while (buffer->has_more()) {
while (buffer->has_more() && character_position++ < offset + length) {
uint16_t character = buffer->GetNext();
if (character_position < offset + length) {
utf8_bytes += unibrow::Utf8::Length(character);
}
character_position++;
utf8_bytes += unibrow::Utf8::Length(character);
}
if (length_return) {
......@@ -5845,16 +5842,13 @@ SmartArrayPointer<char> String::ToCString(AllowNullsFlag allow_nulls,
buffer->Seek(offset);
character_position = offset;
int utf8_byte_position = 0;
while (buffer->has_more()) {
while (buffer->has_more() && character_position++ < offset + length) {
uint16_t character = buffer->GetNext();
if (character_position < offset + length) {
if (allow_nulls == DISALLOW_NULLS && character == 0) {
character = ' ';
}
utf8_byte_position +=
unibrow::Utf8::Encode(result + utf8_byte_position, character);
if (allow_nulls == DISALLOW_NULLS && character == 0) {
character = ' ';
}
character_position++;
utf8_byte_position +=
unibrow::Utf8::Encode(result + utf8_byte_position, character);
}
result[utf8_byte_position] = 0;
return SmartArrayPointer<char>(result);
......
......@@ -150,9 +150,11 @@ const char* StringsStorage::GetVFormatted(const char* format, va_list args) {
const char* StringsStorage::GetName(String* name) {
if (name->IsString()) {
return AddOrDisposeString(
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).Detach(),
name->Hash());
int length = Min(kMaxNameSize, name->length());
SmartArrayPointer<char> data =
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0, length);
uint32_t hash = HashSequentialString(*data, length);
return AddOrDisposeString(data.Detach(), hash);
}
return "";
}
......
......@@ -74,6 +74,8 @@ class StringsStorage {
inline const char* GetFunctionName(const char* name);
private:
static const int kMaxNameSize = 1024;
INLINE(static bool StringsMatch(void* key1, void* key2)) {
return strcmp(reinterpret_cast<char*>(key1),
reinterpret_cast<char*>(key2)) == 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment