[vm, timeline] Remember block creation order instead of sorting in the endless recorder.
Reduces time, and more importantly auxiliary memory, to retrieve the timeline.
Change-Id: I0f87797f6d851d00cc5df0abaf5274693cb95752
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144810
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 48d4884..afbd027 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -1321,13 +1321,13 @@
}
TimelineEventEndlessRecorder::TimelineEventEndlessRecorder()
- : head_(NULL), block_index_(0) {}
+ : head_(nullptr), tail_(nullptr), block_index_(0) {}
TimelineEventEndlessRecorder::~TimelineEventEndlessRecorder() {
TimelineEventBlock* current = head_;
- head_ = NULL;
+ head_ = tail_ = nullptr;
- while (current != NULL) {
+ while (current != nullptr) {
TimelineEventBlock* next = current->next();
delete current;
current = next;
@@ -1374,45 +1374,30 @@
TimelineEventBlock* TimelineEventEndlessRecorder::GetNewBlockLocked() {
TimelineEventBlock* block = new TimelineEventBlock(block_index_++);
- block->set_next(head_);
block->Open();
- head_ = block;
+ if (head_ == nullptr) {
+ head_ = tail_ = block;
+ } else {
+ tail_->set_next(block);
+ tail_ = block;
+ }
if (FLAG_trace_timeline) {
OS::PrintErr("Created new block %p\n", block);
}
- return head_;
+ return block;
}
#ifndef PRODUCT
-static int TimelineEventBlockCompare(TimelineEventBlock* const* a,
- TimelineEventBlock* const* b) {
- return (*a)->LowerTimeBound() - (*b)->LowerTimeBound();
-}
-
void TimelineEventEndlessRecorder::PrintJSONEvents(
JSONArray* events,
TimelineEventFilter* filter) {
MutexLocker ml(&lock_);
ResetTimeTracking();
- // Collect all interesting blocks.
- MallocGrowableArray<TimelineEventBlock*> blocks(8);
- TimelineEventBlock* current = head_;
- while (current != NULL) {
- if (filter->IncludeBlock(current)) {
- blocks.Add(current);
+ for (TimelineEventBlock* current = head_; current != nullptr;
+ current = current->next()) {
+ if (!filter->IncludeBlock(current)) {
+ continue;
}
- current = current->next();
- }
- // Bail early.
- if (blocks.length() == 0) {
- return;
- }
- // Sort the interesting blocks so that blocks with earlier events are
- // outputted first.
- blocks.Sort(TimelineEventBlockCompare);
- // Output blocks in sorted order.
- for (intptr_t block_idx = 0; block_idx < blocks.length(); block_idx++) {
- current = blocks[block_idx];
intptr_t length = current->length();
for (intptr_t i = 0; i < length; i++) {
TimelineEvent* event = current->At(i);
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index e45b144..8841258 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -866,6 +866,7 @@
#endif
TimelineEventBlock* head_;
+ TimelineEventBlock* tail_;
intptr_t block_index_;
friend class TimelineTestHelper;