Index: sdk/lib/developer/timeline.dart |
diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart |
index 55de99dbb92317ec1d63e830a1e35a11aa95f040..15ed062123e8953ced686f007263e261435fb91f 100644 |
--- a/sdk/lib/developer/timeline.dart |
+++ b/sdk/lib/developer/timeline.dart |
@@ -44,17 +44,14 @@ class Timeline { |
'name', |
'Must be a String'); |
} |
- Map instantArguments = { |
- 'isolateNumber': '${Timeline._isolateId}' |
- }; |
+ Map instantArguments; |
if (arguments is Map) { |
- instantArguments.addAll(arguments); |
+ instantArguments = new Map.from(arguments); |
} |
- String argumentsAsJson = JSON.encode(instantArguments); |
_reportInstantEvent(_getTraceClock(), |
'Dart', |
name, |
- argumentsAsJson); |
+ _argumentsAsJson(instantArguments)); |
} |
@@ -72,8 +69,8 @@ class Timeline { |
} |
static final List<_SyncBlock> _stack = new List<_SyncBlock>(); |
- |
static final int _isolateId = _getIsolateNum(); |
+ static final String _isolateIdString = _isolateId.toString(); |
} |
/// An asynchronous task on the timeline. An asynchronous task can have many |
@@ -121,19 +118,16 @@ class TimelineTask { |
'name', |
'Must be a String'); |
} |
- Map instantArguments = { |
- 'isolateNumber': '${Timeline._isolateId}' |
- }; |
+ Map instantArguments; |
if (arguments is Map) { |
- instantArguments.addAll(arguments); |
+ instantArguments = new Map.from(arguments); |
} |
- String argumentsAsJson = JSON.encode(instantArguments); |
_reportTaskEvent(_getTraceClock(), |
_taskId, |
'n', |
'Dart', |
name, |
- argumentsAsJson); |
+ _argumentsAsJson(instantArguments)); |
} |
/// Finish the last synchronous operation that was started. |
@@ -180,14 +174,12 @@ class _AsyncBlock { |
// Emit the start event. |
void _start() { |
- arguments['isolateNumber'] = '${Timeline._isolateId}'; |
- String argumentsAsJson = JSON.encode(arguments); |
_reportTaskEvent(_getTraceClock(), |
_taskId, |
'b', |
category, |
name, |
- argumentsAsJson); |
+ _argumentsAsJson(arguments)); |
} |
// Emit the finish event. |
@@ -197,7 +189,7 @@ class _AsyncBlock { |
'e', |
category, |
name, |
- JSON.encode({})); |
+ _argumentsAsJson(null)); |
} |
} |
@@ -220,20 +212,27 @@ class _SyncBlock { |
/// Finish this block of time. At this point, this block can no longer be |
/// used. |
void finish() { |
- var end = _getTraceClock(); |
- |
- arguments['isolateNumber'] = '${Timeline._isolateId}'; |
- |
- // Encode arguments map as JSON before reporting. |
- var argumentsAsJson = JSON.encode(arguments); |
- |
// Report event to runtime. |
_reportCompleteEvent(_start, |
- end, |
+ _getTraceClock(), |
category, |
name, |
- argumentsAsJson); |
+ _argumentsAsJson(arguments)); |
+ } |
+} |
+ |
+String _fastPathArguments; |
+String _argumentsAsJson(Map arguments) { |
+ if ((arguments == null) || (arguments.length == 0)) { |
+ // Fast path no arguments. Avoid calling JSON.encode. |
+ if (_fastPathArguments == null) { |
+ _fastPathArguments = '{"isolateNumber":"${Timeline._isolateId}"}'; |
+ } |
+ return _fastPathArguments; |
} |
+ // Add isolateNumber to arguments map. |
+ arguments['isolateNumber'] = Timeline._isolateIdString; |
+ return JSON.encode(arguments); |
} |
/// Returns the next async task id. |
@@ -264,4 +263,4 @@ external void _reportCompleteEvent(int start, |
external void _reportInstantEvent(int start, |
String category, |
String name, |
- String argumentsAsJson); |
+ String argumentsAsJson); |