Unverified Commit 057a25cd authored by Kaushik Iska's avatar Kaushik Iska Committed by GitHub

[timeline] Sort timeline events before summarizing (#55771)

parent 958ab933
...@@ -34,12 +34,8 @@ class TimelineEvent { ...@@ -34,12 +34,8 @@ class TimelineEvent {
json['ph'] as String, json['ph'] as String,
json['pid'] as int, json['pid'] as int,
json['tid'] as int, json['tid'] as int,
json['dur'] != null json['dur'] != null ? Duration(microseconds: json['dur'] as int) : null,
? Duration(microseconds: json['dur'] as int) json['tdur'] != null ? Duration(microseconds: json['tdur'] as int) : null,
: null,
json['tdur'] != null
? Duration(microseconds: json['tdur'] as int)
: null,
json['ts'] as int, json['ts'] as int,
json['tts'] as int, json['tts'] as int,
json['args'] as Map<String, dynamic>, json['args'] as Map<String, dynamic>,
...@@ -124,11 +120,32 @@ class TimelineEvent { ...@@ -124,11 +120,32 @@ class TimelineEvent {
List<TimelineEvent> _parseEvents(Map<String, dynamic> json) { List<TimelineEvent> _parseEvents(Map<String, dynamic> json) {
final List<dynamic> jsonEvents = json['traceEvents'] as List<dynamic>; final List<dynamic> jsonEvents = json['traceEvents'] as List<dynamic>;
if (jsonEvents == null) if (jsonEvents == null) {
return null; return null;
}
// TODO(vegorov): use instance method version of castFrom when it is available. // TODO(vegorov): use instance method version of castFrom when it is available.
return Iterable.castFrom<dynamic, Map<String, dynamic>>(jsonEvents) final List<TimelineEvent> timelineEvents =
.map<TimelineEvent>((Map<String, dynamic> eventJson) => TimelineEvent(eventJson)) Iterable.castFrom<dynamic, Map<String, dynamic>>(jsonEvents)
.map<TimelineEvent>(
(Map<String, dynamic> eventJson) => TimelineEvent(eventJson))
.toList(); .toList();
timelineEvents.sort((TimelineEvent e1, TimelineEvent e2) {
final int ts1 = e1.timestampMicros;
final int ts2 = e2.timestampMicros;
if (ts1 == null) {
if (ts2 == null) {
return 0;
} else {
return -1;
}
} else if (ts2 == null) {
return 1;
} else {
return ts1.compareTo(ts2);
}
});
return timelineEvents;
} }
...@@ -32,7 +32,7 @@ void main() { ...@@ -32,7 +32,7 @@ void main() {
expect(timeline.events, hasLength(2)); expect(timeline.events, hasLength(2));
final TimelineEvent e1 = timeline.events[0]; final TimelineEvent e1 = timeline.events[1];
expect(e1.name, 'test event'); expect(e1.name, 'test event');
expect(e1.category, 'test category'); expect(e1.category, 'test category');
expect(e1.phase, 'B'); expect(e1.phase, 'B');
...@@ -44,7 +44,7 @@ void main() { ...@@ -44,7 +44,7 @@ void main() {
expect(e1.threadTimestampMicros, 567); expect(e1.threadTimestampMicros, 567);
expect(e1.arguments, <String, dynamic>{'arg1': true}); expect(e1.arguments, <String, dynamic>{'arg1': true});
final TimelineEvent e2 = timeline.events[1]; final TimelineEvent e2 = timeline.events[0];
expect(e2.name, isNull); expect(e2.name, isNull);
expect(e2.category, isNull); expect(e2.category, isNull);
expect(e2.phase, isNull); expect(e2.phase, isNull);
...@@ -56,5 +56,59 @@ void main() { ...@@ -56,5 +56,59 @@ void main() {
expect(e2.threadTimestampMicros, isNull); expect(e2.threadTimestampMicros, isNull);
expect(e2.arguments, isNull); expect(e2.arguments, isNull);
}); });
test('sorts JSON', () {
final Timeline timeline = Timeline.fromJson(<String, dynamic>{
'traceEvents': <Map<String, dynamic>>[
<String, dynamic>{
'name': 'test event 1',
'ts': 457,
},
<String, dynamic>{
'name': 'test event 2',
'ts': 456,
},
],
});
expect(timeline.events, hasLength(2));
expect(timeline.events[0].timestampMicros, equals(456));
expect(timeline.events[1].timestampMicros, equals(457));
expect(timeline.events[0].name, equals('test event 2'));
expect(timeline.events[1].name, equals('test event 1'));
});
test('sorts JSON nulls first', () {
final Timeline timeline = Timeline.fromJson(<String, dynamic>{
'traceEvents': <Map<String, dynamic>>[
<String, dynamic>{
'name': 'test event 0',
'ts': null,
},
<String, dynamic>{
'name': 'test event 1',
'ts': 457,
},
<String, dynamic>{
'name': 'test event 2',
'ts': 456,
},
<String, dynamic>{
'name': 'test event 3',
'ts': null,
},
],
});
expect(timeline.events, hasLength(4));
expect(timeline.events[0].timestampMicros, isNull);
expect(timeline.events[1].timestampMicros, isNull);
expect(timeline.events[2].timestampMicros, equals(456));
expect(timeline.events[3].timestampMicros, equals(457));
expect(timeline.events[0].name, equals('test event 0'));
expect(timeline.events[1].name, equals('test event 3'));
expect(timeline.events[2].name, equals('test event 2'));
expect(timeline.events[3].name, equals('test event 1'));
});
}); });
} }
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