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

Unified Diff: runtime/vm/json_stream.cc

Issue 2791633002: Avoid many temporary allocations when serializing service protocol responses (Closed)
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/json_stream.cc
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index d95345b4953c184401adf3e477710531c5b33f80..3f50757364cfda4ba6cb9188184b4c86d3984aa0 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -490,21 +490,28 @@ void JSONStream::PrintValueNoEscape(const char* s) {
void JSONStream::PrintfValue(const char* format, ...) {
+ const intptr_t kOnStackBufferCapacity = 4096;
zra 2017/03/31 17:47:09 Maybe something like: class MaybeOnStackBuffer {
Cutch 2017/03/31 18:04:47 Done.
+ char on_stack_buffer[kOnStackBufferCapacity];
PrintCommaIfNeeded();
va_list args;
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
- char* p = reinterpret_cast<char*>(malloc(len + 1));
+ char* p = &on_stack_buffer[0];
+ if (len + 1 >= kOnStackBufferCapacity) {
siva 2017/03/31 17:59:33 ((len + 1) >= kOnStackBufferCapacity) here and bel
Cutch 2017/03/31 18:04:47 Acknowledged.
+ p = reinterpret_cast<char*>(malloc(len + 1));
+ }
va_start(args, format);
intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
va_end(args);
ASSERT(len == len2);
buffer_.AddChar('"');
- AddEscapedUTF8String(p);
+ AddEscapedUTF8String(p, len);
buffer_.AddChar('"');
- free(p);
+ if (p != &on_stack_buffer[0]) {
+ free(p);
+ }
}
@@ -712,20 +719,28 @@ void JSONStream::PrintProperty(const char* name,
void JSONStream::PrintfProperty(const char* name, const char* format, ...) {
+ const intptr_t kOnStackBufferCapacity = 4096;
+ char on_stack_buffer[kOnStackBufferCapacity];
PrintPropertyName(name);
va_list args;
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
- char* p = reinterpret_cast<char*>(malloc(len + 1));
+ char* p = &on_stack_buffer[0];
+ if (len + 1 >= kOnStackBufferCapacity) {
+ p = reinterpret_cast<char*>(malloc(len + 1));
+ }
+
va_start(args, format);
intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
va_end(args);
ASSERT(len == len2);
buffer_.AddChar('"');
- AddEscapedUTF8String(p);
+ AddEscapedUTF8String(p, len);
buffer_.AddChar('"');
- free(p);
+ if (p != &on_stack_buffer[0]) {
+ free(p);
+ }
}
@@ -912,6 +927,8 @@ JSONObject::JSONObject(const JSONArray* arr) : stream_(arr->stream_) {
void JSONObject::AddFixedServiceId(const char* format, ...) const {
+ const intptr_t kOnStackBufferCapacity = 4096;
+ char on_stack_buffer[kOnStackBufferCapacity];
// Mark that this id is fixed.
AddProperty("fixedId", true);
// Add the id property.
@@ -920,15 +937,20 @@ void JSONObject::AddFixedServiceId(const char* format, ...) const {
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
- char* p = reinterpret_cast<char*>(malloc(len + 1));
+ char* p = &on_stack_buffer[0];
+ if (len + 1 >= kOnStackBufferCapacity) {
+ p = reinterpret_cast<char*>(malloc(len + 1));
+ }
va_start(args, format);
intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
va_end(args);
ASSERT(len == len2);
stream_->buffer_.AddChar('"');
- stream_->AddEscapedUTF8String(p);
+ stream_->AddEscapedUTF8String(p, len);
stream_->buffer_.AddChar('"');
- free(p);
+ if (p != &on_stack_buffer[0]) {
+ free(p);
+ }
}
@@ -989,38 +1011,52 @@ void JSONObject::AddUnresolvedLocation(
void JSONObject::AddPropertyF(const char* name, const char* format, ...) const {
+ const intptr_t kOnStackBufferCapacity = 4096;
+ char on_stack_buffer[kOnStackBufferCapacity];
stream_->PrintPropertyName(name);
va_list args;
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
- char* p = reinterpret_cast<char*>(malloc(len + 1));
+ char* p = &on_stack_buffer[0];
+ if (len + 1 >= kOnStackBufferCapacity) {
+ p = reinterpret_cast<char*>(malloc(len + 1));
+ }
va_start(args, format);
intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
va_end(args);
ASSERT(len == len2);
stream_->buffer_.AddChar('"');
- stream_->AddEscapedUTF8String(p);
+ stream_->AddEscapedUTF8String(p, len);
stream_->buffer_.AddChar('"');
- free(p);
+ if (p != &on_stack_buffer[0]) {
+ free(p);
+ }
}
void JSONArray::AddValueF(const char* format, ...) const {
+ const intptr_t kOnStackBufferCapacity = 4096;
+ char on_stack_buffer[kOnStackBufferCapacity];
stream_->PrintCommaIfNeeded();
va_list args;
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
- char* p = reinterpret_cast<char*>(malloc(len + 1));
+ char* p = &on_stack_buffer[0];
+ if (len + 1 >= kOnStackBufferCapacity) {
+ p = reinterpret_cast<char*>(malloc(len + 1));
+ }
va_start(args, format);
intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
va_end(args);
ASSERT(len == len2);
stream_->buffer_.AddChar('"');
- stream_->AddEscapedUTF8String(p);
+ stream_->AddEscapedUTF8String(p, len);
stream_->buffer_.AddChar('"');
- free(p);
+ if (p != &on_stack_buffer[0]) {
+ free(p);
+ }
}
#endif // !PRODUCT
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698