Commit d1ed027e authored by Oystein Eftevaag's avatar Oystein Eftevaag Committed by Commit Bot

Perfetto: Chunk JSON output

Pass JSON strings to the callback (and hence Mojo) once they reach 100kb,
rather than passing one giant string all at once.

BUG=902064

Change-Id: If95811d3ac907d23d2f882e869d88e933ff5d7b0
Reviewed-on: https://chromium-review.googlesource.com/c/1330068
Commit-Queue: oysteine <oysteine@chromium.org>
Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607060}
parent 75d9ad10
......@@ -26,6 +26,8 @@ namespace tracing {
namespace {
const size_t kTraceEventBufferSizeInBytes = 100 * 1024;
void AppendProtoArrayAsJSON(std::string* out,
const perfetto::protos::ChromeTracedValue& array);
......@@ -329,7 +331,12 @@ void JSONTraceExporter::OnTraceData(std::vector<perfetto::TracePacket> packets,
DCHECK(json_callback_);
DCHECK(!packets.empty() || !has_more);
// Since we write each event before checking the limit, we'll
// always go slightly over and hence we reserve some extra space
// to avoid most reallocs.
const size_t kReserveCapacity = kTraceEventBufferSizeInBytes * 5 / 4;
std::string out;
out.reserve(kReserveCapacity);
if (!has_output_json_preamble_) {
out = "{\"traceEvents\":[";
......@@ -353,8 +360,13 @@ void JSONTraceExporter::OnTraceData(std::vector<perfetto::TracePacket> packets,
}
for (auto& event : bundle.trace_events()) {
if (out.size() > kTraceEventBufferSizeInBytes) {
json_callback_.Run(out, nullptr, true);
out.clear();
}
if (has_output_first_event_) {
out += ",";
out += ",\n";
} else {
has_output_first_event_ = true;
}
......
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