Index: sdk/lib/_internal/compiler/implementation/deferred_load.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
index 298c7204bec55f56319c2b2e547f2051b9386842..b93629c73a70e2c3111b5d1928f435e803f81657 100644 |
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
@@ -119,10 +119,15 @@ class DeferredLoadTask extends CompilerTask { |
/// Will be `true` if the program contains deferred libraries. |
bool splitProgram = false; |
- /// A mapping from the name of a [DeferredLibrary] annotation to all dependent |
- /// output units. |
- final Map<String, Set<OutputUnit>> hunksToLoad = |
- new Map<String, Set<OutputUnit>>(); |
+ /// A mapping from the name of a defer import to all the output units it |
+ /// depends on in a list of lists to be loaded in the order they appear. |
+ /// |
+ /// For example {"lib1": [[lib1_lib2_lib3], [lib1_lib2, lib1_lib3], |
+ /// [lib1]]} would mean that in order to load "lib1" first the hunk |
+ /// lib1_lib2_lib2 should be loaded, then the hunks lib1_lib2 and lib1_lib3 |
+ /// can be loaded in parallel. And finally lib1 can be loaded. |
+ final Map<String, List<List<OutputUnit>>> hunksToLoad = |
+ new Map<String, List<List<OutputUnit>>>(); |
final Map<Import, String> importDeferName = new Map<Import, String>(); |
/// A mapping from elements and constants to their output unit. Query this via |
@@ -608,15 +613,26 @@ class DeferredLoadTask extends CompilerTask { |
for (OutputUnit outputUnit in allOutputUnits) { |
computeOutputUnitName(outputUnit); |
} |
+ List sortedOutputUnits = new List.from(allOutputUnits); |
+ // Sort the outputunits in descending order of the number of imports they |
floitsch
2014/04/02 09:32:48
output units
sigurdm
2014/04/02 11:25:30
Done.
|
+ // include. |
floitsch
2014/04/02 09:32:48
Explain why this is necessary and enough.
sigurdm
2014/04/02 11:25:30
I tried to explain it - hope it is not too verbose
|
+ sortedOutputUnits.sort((a, b) => b.imports.length - a.imports.length); |
// For each deferred import we find out which outputUnits to load. |
for (Import import in _allDeferredImports.keys) { |
if (import == _fakeMainImport) continue; |
- hunksToLoad[importDeferName[import]] = new Set<OutputUnit>(); |
- for (OutputUnit outputUnit in allOutputUnits) { |
+ hunksToLoad[importDeferName[import]] = new List<List<OutputUnit>>(); |
+ int lastNumberOfImports = 0; |
+ List<OutputUnit> currentLastList; |
+ for (OutputUnit outputUnit in sortedOutputUnits) { |
if (outputUnit == mainOutputUnit) continue; |
if (outputUnit.imports.contains(import)) { |
- hunksToLoad[importDeferName[import]].add(outputUnit); |
+ if (outputUnit.imports.length != lastNumberOfImports) { |
+ lastNumberOfImports = outputUnit.imports.length; |
+ currentLastList = new List<OutputUnit>(); |
+ hunksToLoad[importDeferName[import]].add(currentLastList); |
+ } |
+ currentLastList.add(outputUnit); |
} |
} |
} |