anchor.diff:  
     setup(path.fromUri(entryUri));
   
  -  Set<Source> files = scanReachableFiles(entryUri);
  -  var handlers = {
  -    'scan': () async => scanFiles(files),
  +  final Set<Source> files = scanReachableFiles(entryUri);
  +  final Set<Uint8List> filesAsBytes = loadFileContentsAsBytes(files);
  +  final handlers = {
  +    'scan': () async => scanFiles(files, tokenize),
  +    'scan_bytes': () async => scanFiles(filesAsBytes, tokenizeBytes),
       'parse': () async => parseFiles(files),
     };
  +
  +  // Ensure we start scanning with a clean string canonicalizer cache.
  +  StringTokenImpl.canonicalizer.clear();
   
     var handler = handlers[bench];
     if (handler == null) {
  
positive.code: /// outlines).
  library front_end.tool.perf;
  
  import 'dart:io' show Directory, File, Platform, exit;
  
  import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
  import 'package:analyzer/dart/analysis/features.dart';
  
negative.code:   return files;
  }
  
  /// Loads the file contents of all [files] as bytes.
  Set<Uint8List> loadFileContentsAsBytes(Set<Source> files) {
    return files.map((Source source) {
      final bytes = utf8.encode(source.contents.data) as Uint8List;
      // CFE needs files to e 0-terminated.
      return Uint8List(bytes.length + 1)
        ..setRange(0, bytes.length, bytes)
        ..[bytes.length] = 0;
    }).toSet();
  }
  
  /// Sets up analyzer to be able to load and resolve app, packages, and sdk
  /// sources.
  void setup(String path) {
  