blob: 129e95f986745f1f12cb24baa56e39f4be800588 [file] [log] [blame]
// Copyright (c) 2016, 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.
/// This tool gives a breakdown of code size by deferred part in the program.
library dart2js_info.bin.deferred_library_size;
import 'dart:math';
import 'package:dart2js_info/info.dart';
import 'package:dart2js_info/src/util.dart';
main(args) async {
// TODO(het): Would be faster to only parse the 'outputUnits' part
var info = await infoFromFile(args.first);
var sizeByImport = getSizeByImport(info);
printSizes(sizeByImport, info.program.size);
}
class ImportSize {
final String import;
final int size;
const ImportSize(this.import, this.size);
String toString() {
return '$import: $size';
}
}
void printSizes(Map<String, int> sizeByImport, int programSize) {
var importSizes = <ImportSize>[];
sizeByImport.forEach((import, size) {
importSizes.add(new ImportSize(import, size));
});
// Sort by size, largest first.
importSizes.sort((a, b) => b.size - a.size);
int longest = importSizes.fold('Percent of code deferred'.length,
(longest, importSize) => max(longest, importSize.import.length));
_printRow(label, data, {int width: 15}) {
print('${label.toString().padRight(longest + 1)}'
'${data.toString().padLeft(width)}');
}
print('');
print('Size by library');
print('-' * (longest + 16));
for (var importSize in importSizes) {
// TODO(het): split into specific and shared size
_printRow(importSize.import, importSize.size);
}
print('-' * (longest + 16));
var mainChunkSize = sizeByImport['main'];
var deferredSize = programSize - mainChunkSize;
var percentDeferred = (deferredSize * 100 / programSize).toStringAsFixed(2);
_printRow('Main chunk size', mainChunkSize);
_printRow('Deferred code size', deferredSize);
_printRow('Percent of code deferred', '$percentDeferred%');
}
Map<String, int> getSizeByImport(AllInfo info) {
var sizeByImport = <String, int>{};
for (var outputUnit in info.outputUnits) {
if (outputUnit.name == 'main' || outputUnit.name == null) {
sizeByImport['main'] = outputUnit.size;
} else {
for (var import in outputUnit.imports) {
sizeByImport.putIfAbsent(import, () => 0);
sizeByImport[import] += outputUnit.size;
}
}
}
return sizeByImport;
}