| #!/bin/bash | 
 | # Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 | # | 
 | # Usage: szcmp files | 
 | # | 
 | # Compare sizes of files as percentages in a table.  Column header is the | 
 | # baseline (i.e. all sizes in the column are in terms of the file in the column | 
 | # header). | 
 | # | 
 | # Example with dart2js workflow: | 
 | # | 
 | #     $ dart2js  ...  --out=v1/m.js | 
 | #     # change dart2js | 
 | #     $ dart2js  ...  --out=v2/m.js | 
 | #     # change dart2js again | 
 | #     $ dart2js  ...  --out=v3/m.js | 
 | # | 
 | #     $ szcmp v?/m.js | 
 | #                       v1/m.js  v2/m.js  v3/m.js | 
 | #     5793879  v1/m.js        =  -4.499%  +4.461% | 
 | #     6066812  v2/m.js  +4.711%        =  +9.382% | 
 | #     5546433  v3/m.js  -4.271%  -8.577%        = | 
 | # | 
 | # The first column of the matrix is usually the most relevant - `v2` is 4.7% | 
 | # larger than `v1` and `v3` is 4.2% smaller than `v1`. The other columns can be | 
 | # useful for understanding the differential changes. Sizes relative to `v2` are | 
 | # in the next column, e.g. the step from `v2` to `v3` was a reduction of | 
 | # 8.6%. Above-diagonal values show the percentage change in the 'undo' | 
 | # direction. While changing from `v2` to `v3` reduces by 8.6%, reverting that | 
 | # change would be an increase of 9.4%. | 
 |  | 
 | wc -c "$@" | | 
 | awk ' | 
 | $2 == "total" { next; } | 
 |  | 
 | { | 
 |   N++ | 
 |   r[N,0] = $1; | 
 |   r[N,1] = $2; | 
 | } | 
 |  | 
 | END { | 
 |   r[0,0] = ""  # header col 0 | 
 |   r[0,1] = ""  # header col 1 | 
 |  | 
 |   for (i = 1; i <= N; i++) { #skips "total" line | 
 |     r[0, i+1] = r[i,1]  # name header | 
 |  | 
 |     for (j = 1; j <= N; j++) { | 
 |       s1 = r[i,0] | 
 |       s2 = r[j,0]; | 
 |       if (s1 == s2) { | 
 |         r[i, j+1] = "=" | 
 |       } else { | 
 |         x = sprintf("%.3f%%", (s1 - s2) / s2 * 100) | 
 |         if (s1 > s2) x = "+" x | 
 |         r[i, j+1] = x | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   # find column widths | 
 |   for (cc = 0; cc <= N+1; cc++) { | 
 |     w[cc] = 0; | 
 |     for (rr = 0; rr <= N; rr++) { | 
 |       if (length(r[rr,cc]) > w[cc]) w[cc] = length(r[rr,cc]) | 
 |     } | 
 |   } | 
 |  | 
 |   for (rr = 0; rr <= N; rr++) { | 
 |     line = "" | 
 |     sep = "" | 
 |     for (cc = 0; cc <= N+1; cc++) { | 
 |       line = line sep sprintf("%*s", w[cc], r[rr, cc]) | 
 |       sep = "  " | 
 |     } | 
 |     print line | 
 |   } | 
 | } | 
 | ' |