Skip to content

Commit a547cfc

Browse files
natebiggsCommit Bot
authored andcommitted
[dart2js] Defer deserialized CodegenResults by members.
For large applications only ~60% of these objects are used. This defers their deserializtion until they're accessed in the codegen member map. In local testing on large applications this saved ~200MB of memory usage in the linker phase. Change-Id: I8ff87803fc23ef2d3f954646687e3fc67b68a4f7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/254600 Commit-Queue: Nate Biggs <[email protected]> Reviewed-by: Joshua Litt <[email protected]>
1 parent a304e5b commit a547cfc

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

pkg/compiler/lib/src/serialization/task.dart

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import '../js_model/locals.dart';
2828
import '../options.dart';
2929
import '../util/sink_adapter.dart';
3030
import '../world.dart';
31+
import 'deferrable.dart';
3132
import 'serialization.dart';
3233

3334
/// A data class holding some data [T] and the associated [DataSourceIndices].
@@ -340,7 +341,7 @@ class SerializationTask extends CompilerTask {
340341
sink.writeMemberMap(
341342
results,
342343
(MemberEntity member, CodegenResult result) =>
343-
result.writeToDataSink(sink));
344+
sink.writeDeferrable(() => result.writeToDataSink(sink)));
344345
sink.close();
345346
});
346347
}
@@ -353,7 +354,7 @@ class SerializationTask extends CompilerTask {
353354
bool useDeferredSourceReads) async {
354355
int shards = _options.codegenShards;
355356
JClosedWorld closedWorld = globalTypeInferenceResults.closedWorld;
356-
Map<MemberEntity, CodegenResult> results = {};
357+
Map<MemberEntity, Deferrable<CodegenResult>> results = {};
357358
for (int shard = 0; shard < shards; shard++) {
358359
Uri uri = Uri.parse('${_options.readCodegenUri}$shard');
359360
await measureIoSubtask('deserialize codegen', () async {
@@ -368,7 +369,7 @@ class SerializationTask extends CompilerTask {
368369
});
369370
}
370371
return DeserializedCodegenResults(
371-
globalTypeInferenceResults, codegenInputs, results);
372+
globalTypeInferenceResults, codegenInputs, DeferrableValueMap(results));
372373
}
373374

374375
void _deserializeCodegenInput(
@@ -377,7 +378,7 @@ class SerializationTask extends CompilerTask {
377378
Uri uri,
378379
api.Input<List<int>> dataInput,
379380
DataSourceIndices importedIndices,
380-
Map<MemberEntity, CodegenResult> results,
381+
Map<MemberEntity, Deferrable<CodegenResult>> results,
381382
bool useDeferredSourceReads) {
382383
DataSourceReader source = DataSourceReader(
383384
BinaryDataSource(dataInput.data, stringInterner: _stringInterner),
@@ -386,17 +387,19 @@ class SerializationTask extends CompilerTask {
386387
importedIndices: importedIndices,
387388
useDeferredStrategy: useDeferredSourceReads);
388389
backendStrategy.prepareCodegenReader(source);
389-
Map<MemberEntity, CodegenResult> codegenResults =
390+
Map<MemberEntity, Deferrable<CodegenResult>> codegenResults =
390391
source.readMemberMap((MemberEntity member) {
391-
List<ModularName> modularNames = [];
392-
List<ModularExpression> modularExpressions = [];
393-
CodegenReader reader =
394-
CodegenReaderImpl(closedWorld, modularNames, modularExpressions);
395-
source.registerCodegenReader(reader);
396-
CodegenResult result = CodegenResult.readFromDataSource(
397-
source, modularNames, modularExpressions);
398-
source.deregisterCodegenReader(reader);
399-
return result;
392+
return source.readDeferrable(() {
393+
List<ModularName> modularNames = [];
394+
List<ModularExpression> modularExpressions = [];
395+
CodegenReader reader =
396+
CodegenReaderImpl(closedWorld, modularNames, modularExpressions);
397+
source.registerCodegenReader(reader);
398+
CodegenResult result = CodegenResult.readFromDataSource(
399+
source, modularNames, modularExpressions);
400+
source.deregisterCodegenReader(reader);
401+
return result;
402+
});
400403
});
401404
_reporter.log('Read ${codegenResults.length} members from ${uri}');
402405
results.addAll(codegenResults);

0 commit comments

Comments
 (0)