anchor.diff:        }
       }
   
  -    AST ast = rootScope._astParser(expression,
  -        formatters: formatters, collection: collection);
  +    String astKey =
  +        "${collection ? "C" : "."}${formatters == null ? "." : formatters.hashCode}$expression";
  +    AST ast = rootScope.astCache[astKey];
  +    if (ast == null) {
  +      ast = rootScope.astCache[astKey] =
  +          rootScope._astParser(expression,
  +              formatters: formatters, collection: collection);
  +    }
   
       return watch = watchAST(ast, fn, canChangeModel: canChangeModel);
     }
  
positive.code: 
    RootScope(Object context, Parser parser, ASTParser astParser,
              FieldGetterFactory fieldGetterFactory, FormatterMap formatters, this._exceptionHandler,
              ScopeDigestTTL ttl, this._zone, ScopeStats _scopeStats)
        : _scopeStats = _scopeStats,
          _ttl = ttl,
          _parser = parser,
  
negative.code:     for(num i = 0; i <= _ttl.ttl; i++) {
        _digestTags.add(new UserTag('NgDigest${i}'));
      }
      cacheRegister.registerCache("ScopeWatchASTs", astCache);
    }
  
    RootScope get rootScope => this;
  