anchor.diff:    /**
      * Creates an empty [Multiset].
      */
  -  factory Multiset() => new Multiset<E>._(new Map<E, int>());
  +  factory Multiset() => new Multiset<E>._(new Map<E, int>(), 0);
   
     /**
      * Creates an empty identity [Multiset].
      */
  -  factory Multiset.identity() => new Multiset<E>._(new Map<E, int>.identity());
  +  factory Multiset.identity() => new Multiset<E>._(new Map<E, int>.identity(), 0);
   
     /**
      * Creates a multiset that contains all elements of [other].
      */
     factory Multiset.from(Iterable<E> other) {
       if (other is Multiset<E>) {
  -      return new Multiset<E>._(new Map.from(other._container));
  +      return new Multiset<E>._(new Map.from(other._container), other._length);
       } else {
         return new Multiset<E>()..addAll(other);
       }
     }
   
  +  /**
  +   * The backing container of the set.
  +   */
     final Map<E, int> _container;
   
  -  Multiset._(this._container);
  +  /**
  +   * The cached number of elements.
  +   */
  +  int _length;
  +
  +  Multiset._(this._container, this._length);
   
     /**
      * Adds [element] to the receiver [occurrences] number of times.
  
positive.code:       throw new ArgumentError('Negative number of occurences');
      } else if (occurences > 0) {
        _container[element] = this[element] + occurences;
      }
    }
  
  
negative.code:       var current = this[element];
        if (current <= occurences) {
          _container.remove(element);
          _length -= current;
        } else {
          _container[element] = current - occurences;
          _length -= occurences;
        }
      }
    }
  