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:
+37
-15
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user