Improve the output of the diff tool (#45)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a821d69..f1bc876 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.5.12
+
+* Improved output of `dart2js_info_diff` by sorting the diffs by
+ size and outputting the summary in full output mode.
+
## 0.5.11
* Added `--summary` option to `dart2js_info_diff` tool.
diff --git a/README.md b/README.md
index cc9df90..385ceb7 100644
--- a/README.md
+++ b/README.md
@@ -141,28 +141,64 @@
Here's an example output:
```
-OVERALL SIZE DIFFERENCE
-========================================================================
-3 bytes
+total_size_difference -2688
+total_added 0
+total_removed 2321
+total_size_changed -203
+total_became_deferred 0
+total_no_longer_deferred 0
-ADDED
+ADDED (0 bytes)
========================================================================
-REMOVED
+REMOVED (2321 bytes)
========================================================================
-file:///home/het/Code/foo/foo.dart::A.y: 0 bytes
+dart:_js_helper::getRuntimeTypeString: 488 bytes
+dart:_js_helper::substitute: 479 bytes
+dart:_js_helper::TypeImpl.toString: 421 bytes
+dart:_js_helper::computeSignature: 204 bytes
+dart:_js_helper::getRuntimeTypeArguments: 181 bytes
+dart:_js_helper::extractFunctionTypeObjectFrom: 171 bytes
+dart:_js_helper::getTypeArgumentByIndex: 147 bytes
+dart:_js_helper::runtimeTypeToString: 136 bytes
+dart:_js_helper::setRuntimeTypeInfo: 94 bytes
+dart:core::Object.runtimeType: 0 bytes
+dart:_js_helper::getRawRuntimeType: 0 bytes
+dart:_js_helper::invoke: 0 bytes
+dart:_js_helper::invokeOn: 0 bytes
+dart:_js_helper::getField: 0 bytes
+dart:_js_helper::getClassName: 0 bytes
+dart:_js_helper::getRuntimeType: 0 bytes
+dart:_js_helper::TypeImpl.TypeImpl: 0 bytes
-CHANGED SIZE
+CHANGED SIZE (-203 bytes)
+========================================================================
+dart:_interceptors::JSUnmodifiableArray: -3 bytes
+dart:core::List: -3 bytes
+dart:_interceptors::ArrayIterator: -4 bytes
+dart:_js_helper::TypeImpl._typeName: -10 bytes
+dart:_js_helper::TypeImpl._unmangledName: -15 bytes
+dart:_js_names::: -30 bytes
+dart:_js_names::extractKeys: -30 bytes
+dart:core::StringBuffer: -40 bytes
+dart:core::StringBuffer._writeAll: -40 bytes
+dart:core::: -43 bytes
+dart:_interceptors::JSArray.+: -63 bytes
+dart:_interceptors::JSArray: -66 bytes
+dart:_interceptors::: -73 bytes
+dart:_js_helper::TypeImpl: -481 bytes
+dart:_js_helper::: -2445 bytes
+
+BECAME DEFERRED (0 bytes)
========================================================================
-BECAME DEFERRED
-========================================================================
-
-NO LONGER DEFERRED
+NO LONGER DEFERRED (0 bytes)
========================================================================
```
+You can also pass `--summary` to only show the summary section.
+
### Library size split tool
This command-line tool shows the size distribution of generated code among
diff --git a/bin/diff.dart b/bin/diff.dart
index 2bac65e..8be1dd3 100644
--- a/bin/diff.dart
+++ b/bin/diff.dart
@@ -56,12 +56,48 @@
}
}
- if (summary) {
- reportSummary(oldInfo, newInfo, adds, removals, sizeChanges, becameDeferred,
- becameUndeferred);
- } else {
+ // Sort the changes by the size of the element that changed.
+ for (var diffs in [adds, removals, becameDeferred, becameUndeferred]) {
+ diffs.sort((a, b) => b.info.size - a.info.size);
+ }
+
+ // Sort changes in size by size difference.
+ sizeChanges.sort((a, b) => b.sizeDifference - a.sizeDifference);
+
+ var totalSizes = <List<Diff>, int>{};
+ for (var diffs in [adds, removals, becameDeferred, becameUndeferred]) {
+ var totalSize = 0;
+ for (var diff in diffs) {
+ // Only count diffs from leaf elements so we don't double count
+ // them when we account for class size diff or library size diff.
+ if (diff.info.kind == InfoKind.field ||
+ diff.info.kind == InfoKind.function ||
+ diff.info.kind == InfoKind.closure ||
+ diff.info.kind == InfoKind.typedef) {
+ totalSize += diff.info.size;
+ }
+ }
+ totalSizes[diffs] = totalSize;
+ }
+ var totalSizeChange = 0;
+ for (var sizeChange in sizeChanges) {
+ // Only count diffs from leaf elements so we don't double count
+ // them when we account for class size diff or library size diff.
+ if (sizeChange.info.kind == InfoKind.field ||
+ sizeChange.info.kind == InfoKind.function ||
+ sizeChange.info.kind == InfoKind.closure ||
+ sizeChange.info.kind == InfoKind.typedef) {
+ totalSizeChange += sizeChange.sizeDifference;
+ }
+ }
+ totalSizes[sizeChanges] = totalSizeChange;
+
+ reportSummary(oldInfo, newInfo, adds, removals, sizeChanges, becameDeferred,
+ becameUndeferred, totalSizes);
+ if (!summary) {
+ print('');
reportFull(oldInfo, newInfo, adds, removals, sizeChanges, becameDeferred,
- becameUndeferred);
+ becameUndeferred, totalSizes);
}
}
@@ -72,27 +108,16 @@
List<RemoveDiff> removals,
List<SizeDiff> sizeChanges,
List<DeferredStatusDiff> becameDeferred,
- List<DeferredStatusDiff> becameUndeferred) {
+ List<DeferredStatusDiff> becameUndeferred,
+ Map<List<Diff>, int> totalSizes) {
var overallSizeDiff = newInfo.program.size - oldInfo.program.size;
print('total_size_difference $overallSizeDiff');
- var noLongerDeferred = 0;
- for (var diff in becameUndeferred) {
- noLongerDeferred += diff.info.size;
- }
- print('no_longer_deferred $noLongerDeferred');
-
- var totalAdded = 0;
- for (var diff in adds) {
- totalAdded += diff.info.size;
- }
- print('total_added $totalAdded');
-
- var totalRemoved = 0;
- for (var diff in removals) {
- totalRemoved += diff.info.size;
- }
- print('total_removed $totalRemoved');
+ print('total_added ${totalSizes[adds]}');
+ print('total_removed ${totalSizes[removals]}');
+ print('total_size_changed ${totalSizes[sizeChanges]}');
+ print('total_became_deferred ${totalSizes[becameDeferred]}');
+ print('total_no_longer_deferred ${totalSizes[becameUndeferred]}');
}
void reportFull(
@@ -102,49 +127,46 @@
List<RemoveDiff> removals,
List<SizeDiff> sizeChanges,
List<DeferredStatusDiff> becameDeferred,
- List<DeferredStatusDiff> becameUndeferred) {
+ List<DeferredStatusDiff> becameUndeferred,
+ Map<List<Diff>, int> totalSizes) {
// TODO(het): Improve this output. Siggi has good suggestions in
// https://github.com/dart-lang/dart2js_info/pull/19
- var overallSizeDiff = newInfo.program.size - oldInfo.program.size;
- _section('OVERALL SIZE DIFFERENCE');
- print('$overallSizeDiff bytes');
- print('');
- _section('ADDED');
+ _section('ADDED', size: totalSizes[adds]);
for (var add in adds) {
print('${longName(add.info, useLibraryUri: true)}: ${add.info.size} bytes');
}
print('');
- _section('REMOVED');
+ _section('REMOVED', size: totalSizes[removals]);
for (var removal in removals) {
print('${longName(removal.info, useLibraryUri: true)}: '
'${removal.info.size} bytes');
}
print('');
- _section('CHANGED SIZE');
+ _section('CHANGED SIZE', size: totalSizes[sizeChanges]);
for (var sizeChange in sizeChanges) {
print('${longName(sizeChange.info, useLibraryUri: true)}: '
'${sizeChange.sizeDifference} bytes');
}
print('');
- _section('BECAME DEFERRED');
+ _section('BECAME DEFERRED', size: totalSizes[becameDeferred]);
for (var diff in becameDeferred) {
print('${longName(diff.info, useLibraryUri: true)}: '
'${diff.info.size} bytes');
}
print('');
- _section('NO LONGER DEFERRED');
+ _section('NO LONGER DEFERRED', size: totalSizes[becameUndeferred]);
for (var diff in becameUndeferred) {
print('${longName(diff.info, useLibraryUri: true)}: '
'${diff.info.size} bytes');
}
}
-void _section(String title) {
- print(title);
+void _section(String title, {int size}) {
+ print('$title ($size bytes)');
print('=' * 72);
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 636e370..48cc510 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: dart2js_info
-version: 0.5.11
+version: 0.5.12
description: >
Libraries and tools to process data produced when running dart2js with