| 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); | 
|  |