SuperSize Diffs

Diffs are represented by a DeltaSizeInfo, where each DeltaSymbol contains a reference to a before and after symbol.

For new symbols, before is None, and for removed symbols, after is None.

Diff Algorithm

The diffing algorithm is optimized for the common case of many unchanged symbols.

  1. Create a map of $DIFF_KEY -> symbol for all “before” symbols.
  2. For all “after” symbols, find matches using the map.
  3. Repeat steps 1 and 2 for all remaining symbols using different $DIFF_KEYs
  4. Treat all unmatches symbols as added or removed.

DeltaSymbols for symbols that have not changed are created when diffing, but discarded when writing .sizediff files (see file_format.md).

The $DIFF_KEYs are:

  1. DIFF_KEY=(container, section, full_name, path, s.size_without_padding)
    • Ensures identical symbols are matched.
  2. DIFF_KEY=(container, section, full_name, path)
    • Ensures identical symbols that have changed in size are matched.
  3. DIFF_KEY=(container, section, name, path)
    • Match up symbols with the same name, but differing function signatures.
  4. DIFF_KEY=(container, section, full_name)
    • Match symbols that have changed paths.
    • Does not often match moved Java files, since package names tend to change.

Diffs and Padding

Since symbol padding tends to fluctuate from build to build, changes to padding is not considered. Padding is removed from all symbols when diffing and per-section cumulative change in padding is shown by a symbol called Overhead: aggregate padding of diff'ed symbol.

Diffs and Aliases

No special treatment is made for symbols aliases. If the number of symbols in an alias group changes, a diff will show a size change for all symbols in the group. In the past there was an attempt to have diffs exclude showing changes to the number of aliases in a group, but it never worked reliably and added a lot of complexity. E.g., A symbol from one alias group changes to belong to a different alias group.