| #!/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 | |
| } | |
| } | |
| ' |