def _DiffSymbolGroups(before, after): # For changed symbols, padding is zeroed out. In order to not lose the # information entirely, store it in aggregate. padding_by_section_name = collections.defaultdict(int) # Usually >90% of symbols are exact matches, so all of the time is spent in # this first pass. all_deltas, before, after = _MatchSymbols(before, after, _Key1, padding_by_section_name) for key_func in (_Key2, _Key3, _Key4): delta_syms, before, after = _MatchSymbols(before, after, key_func, padding_by_section_name) all_deltas.extend(delta_syms) logging.debug('Creating %d unmatched symbols', len(after) + len(before)) for after_sym in after: all_deltas.append(models.DeltaSymbol(None, after_sym)) for before_sym in before: all_deltas.append(models.DeltaSymbol(before_sym, None)) # Create a DeltaSymbol to represent the zero'd out padding of matched symbols. for section_name, padding in padding_by_section_name.items(): if padding != 0: after_sym = models.Symbol(section_name, padding) # This is after _NormalizeNames() is called, so set |full_name|, # |template_name|, and |name|. after_sym.SetName("Overhead: aggregate padding of diff'ed symbols") after_sym.padding = padding all_deltas.append(models.DeltaSymbol(None, after_sym)) return models.DeltaSymbolGroup(all_deltas)
def _DiffSymbolGroups(before, after): # For changed symbols, padding is zeroed out. In order to not lose the # information entirely, store it in aggregate. padding_by_section_name = collections.defaultdict(int) # Usually >90% of symbols are exact matches, so all of the time is spent in # this first pass. all_deltas, before, after = _MatchSymbols(before, after, _ExactMatchKey, padding_by_section_name) for key_func in (_GoodMatchKey, _PoorMatchKey): delta_syms, before, after = _MatchSymbols(before, after, key_func, padding_by_section_name) all_deltas.extend(delta_syms) logging.debug('Creating %d unmatched symbols', len(after) + len(before)) for after_sym in after: all_deltas.append(models.DeltaSymbol(None, after_sym)) for before_sym in before: all_deltas.append(models.DeltaSymbol(before_sym, None)) # Create a DeltaSymbol to represent the zero'd out padding of matched symbols. for section_name, padding in padding_by_section_name.iteritems(): if padding != 0: after_sym = models.Symbol( section_name, padding, name="** aggregate padding of diff'ed symbols") after_sym.padding = padding all_deltas.append(models.DeltaSymbol(None, after_sym)) return models.DeltaSymbolGroup(all_deltas)
def _MatchSymbols(before, after, key_func, padding_by_section_name): logging.debug('%s: Building symbol index', key_func.__name__) before_symbols_by_key = collections.defaultdict(list) for s in before: before_symbols_by_key[key_func(s)].append(s) logging.debug('%s: Creating delta symbols', key_func.__name__) unmatched_after = [] delta_symbols = [] for after_sym in after: key = key_func(after_sym) before_sym = key and before_symbols_by_key.get(key) if before_sym: before_sym = before_sym.pop(0) # Padding tracked in aggregate, except for padding-only symbols. if before_sym.size_without_padding != 0: padding_by_section_name[before_sym.section_name] += ( after_sym.padding_pss - before_sym.padding_pss) delta_symbols.append(models.DeltaSymbol(before_sym, after_sym)) else: unmatched_after.append(after_sym) logging.debug('%s: Matched %d of %d symbols', key_func.__name__, len(delta_symbols), len(after)) unmatched_before = [] for syms in before_symbols_by_key.values(): unmatched_before.extend(syms) return delta_symbols, unmatched_before, unmatched_after
def _DiffSymbolGroups(containers, before, after): # For changed symbols, padding is zeroed out. In order to not lose the # information entirely, store it in aggregate. These aggregations are grouped # by "segment names", which are (container name, section name) tuples. padding_by_segment = collections.defaultdict(float) # Usually >90% of symbols are exact matches, so all of the time is spent in # this first pass. all_deltas, before, after = _MatchSymbols(before, after, _Key1, padding_by_segment) for key_func in (_Key2, _Key3, _Key4): delta_syms, before, after = _MatchSymbols(before, after, key_func, padding_by_segment) all_deltas.extend(delta_syms) logging.debug('Creating %d unmatched symbols', len(after) + len(before)) for after_sym in after: all_deltas.append(models.DeltaSymbol(None, after_sym)) for before_sym in before: all_deltas.append(models.DeltaSymbol(before_sym, None)) container_from_name = {c.name: c for c in containers} # Create a DeltaSymbol to represent the zero'd out padding of matched symbols. for (container_name, section_name), padding in padding_by_segment.items(): # Values need to be integer (crbug.com/1132394). padding = round(padding) if padding != 0: after_sym = models.Symbol(section_name, padding) after_sym.container = container_from_name[container_name] # This is after _NormalizeNames() is called, so set |full_name|, # |template_name|, and |name|. after_sym.SetName("Overhead: aggregate padding of diff'ed symbols") after_sym.padding = padding all_deltas.append(models.DeltaSymbol(None, after_sym)) return models.DeltaSymbolGroup(all_deltas)