anchor.diff:  /// Parse the full body of [source] and return it's compilation unit.
   CompilationUnit parseFull(Source source) {
     var token = tokenize(source);
  +  parseTimer.start();
     var parser = new Parser(source, AnalysisErrorListener.NULL_LISTENER);
  -  return parser.parseCompilationUnit(token);
  +  var unit = parser.parseCompilationUnit(token);
  +  parseTimer.stop();
  +  return unit;
   }
   
   UnlinkedUnitBuilder unlinkedSummarize(Source source) {
     var unit = parseFull(source);
  -  return serializeAstUnlinked(unit);
  +  unlinkedSummarizeTimer.start();
  +  var unlinkedUnit = serializeAstUnlinked(unit);
  +  unlinkedSummarizeTimer.stop();
  +  return unlinkedUnit;
   }
   
   /// Scan [source] and return the first token produced by the scanner.
  
positive.code: 
  /// Cumulative time spent scanning.
  Stopwatch scanTimer = new Stopwatch();
  
  /// Factory to load and resolve app, packages, and sdk sources.
  SourceFactory sources;
  
negative.code:   scanTimer = new Stopwatch();
    var old = scanTotalChars;
    scanTotalChars = 0;
    parseTimer = new Stopwatch();
    unlinkedSummarizeTimer = new Stopwatch();
    for (var source in files) {
      unlinkedSummarize(source);
    }
  
    if (old != scanTotalChars) print('input size changed? ${old} chars');
    report("scan", scanTimer.elapsedMicroseconds);
    report("parse", parseTimer.elapsedMicroseconds);
    report('unlinked summarize', unlinkedSummarizeTimer.elapsedMicroseconds);
    report(
        'unlinked summarize + parse',
        unlinkedSummarizeTimer.elapsedMicroseconds +
            parseTimer.elapsedMicroseconds);
  }
  
  /// Add to [files] all sources reachable from [start].
  