Avoid many temporary allocations when serializing service protocol responses

- [x] Use an on stack buffer for small string allocations.
- [x] Avoid unnecessary calls to strlen.

Related #29207

BUG=
R=rmacnak@google.com, zra@google.com

Review-Url: https://codereview.chromium.org/2791633002 .
This commit is contained in:
John McCutchan
2017-03-31 13:20:07 -07:00
parent 4c4c9f2ce6
commit 904beb3d9d
+37 -15
View File
@@ -23,6 +23,28 @@ namespace dart {
#ifndef PRODUCT
class MaybeOnStackBuffer {
public:
explicit MaybeOnStackBuffer(intptr_t size) {
if (size > kOnStackBufferCapacity) {
p_ = reinterpret_cast<char*>(malloc(size));
} else {
p_ = &buffer_[0];
}
}
~MaybeOnStackBuffer() {
if (p_ != &buffer_[0]) free(p_);
}
char* p() { return p_; }
private:
static const intptr_t kOnStackBufferCapacity = 4096;
char* p_;
char buffer_[kOnStackBufferCapacity];
};
void AppendJSONStreamConsumer(Dart_StreamConsumer_State state,
const char* stream_name,
const uint8_t* buffer,
@@ -496,15 +518,15 @@ void JSONStream::PrintfValue(const char* format, ...) {
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
char* p = reinterpret_cast<char*>(malloc(len + 1));
MaybeOnStackBuffer mosb(len + 1);
char* p = mosb.p();
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);
}
@@ -717,15 +739,15 @@ void JSONStream::PrintfProperty(const char* name, const char* format, ...) {
va_start(args, format);
intptr_t len = OS::VSNPrint(NULL, 0, format, args);
va_end(args);
char* p = reinterpret_cast<char*>(malloc(len + 1));
MaybeOnStackBuffer mosb(len + 1);
char* p = mosb.p();
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);
}
@@ -920,15 +942,15 @@ 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));
MaybeOnStackBuffer mosb(len + 1);
char* p = mosb.p();
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);
}
@@ -994,15 +1016,15 @@ void JSONObject::AddPropertyF(const char* name, 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));
MaybeOnStackBuffer mosb(len + 1);
char* p = mosb.p();
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);
}
@@ -1012,15 +1034,15 @@ void JSONArray::AddValueF(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));
MaybeOnStackBuffer mosb(len + 1);
char* p = mosb.p();
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);
}
#endif // !PRODUCT