Skip to content

Commit 2ddf0c6

Browse files
nshahanCommit Queue
authored and
Commit Queue
committed
[ddc] Use prototype trick for better chrome performance
After emitting a library, creates a dummy function for each library and sets the library object as the `.prototype` of the dummy function. Reverses the performance degradation seen after adding one too many members to the `dart:_runtime` library in: https://golem.corp.goog/PerformanceChanges?repository=dart&revision=116131 According to sra@ this serves as a signal to V8 that the members of the library should get optimized for fast lookup. These golem runs show performance improvements that support this. dartdevc performance improvements: https://golem.corp.goog/Comparison?repository=dart#targetA%3Ddartdevc%3BmachineTypeA%3Dlinux-x64%3BrevisionA%3D116273%3BpatchA%3Dnshahan--ddc--WIP-library-as-prototype-optimization-1%3BtargetB%3Ddartdevc%3BmachineTypeB%3Dlinux-x64%3BrevisionB%3D116238%3BpatchB%3DNone dartdevc-canary performance improvements: https://golem.corp.goog/Comparison?repository=dart#targetA%3Ddartdevc-canary%3BmachineTypeA%3Dlinux-x64%3BrevisionA%3D116273%3BpatchA%3Dnshahan--ddc--WIP-library-as-prototype-optimization-1%3BtargetB%3Ddartdevc-canary%3BmachineTypeB%3Dlinux-x64%3BrevisionB%3D116238%3BpatchB%3DNone Change-Id: Ifee464e393609c30eff4ea7c19da511134eccdcf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/427822 Reviewed-by: Nate Biggs <[email protected]> Commit-Queue: Nicholas Shahan <[email protected]>
1 parent c1f11fe commit 2ddf0c6

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

pkg/dev_compiler/lib/src/kernel/compiler.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,12 @@ class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
927927
_emitLibraryProcedures(library);
928928
_emitTopLevelFields(library.fields);
929929
}
930+
// Creating a function and setting the library object as the prototype
931+
// serves as a signal to V8 that the members of the library should get
932+
// optimized for fast lookup.
933+
// Do not remove without testing for performance regressions.
934+
_moduleItems.add(js.statement(
935+
'(function() {}).prototype = #', [_libraries[_currentLibrary!]]));
930936
_staticTypeContext.leaveLibrary(_currentLibrary!);
931937
_currentLibrary = null;
932938
}

pkg/dev_compiler/lib/src/kernel/compiler_new.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,12 @@ class LibraryCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
11631163
library.classes.forEach(_emitClass);
11641164
_emitLibraryMembers(library);
11651165
}
1166+
// Creating a function and setting the library object as the prototype
1167+
// serves as a signal to V8 that the members of the library should get
1168+
// optimized for fast lookup.
1169+
// Do not remove without testing for performance regressions.
1170+
_moduleItems.add(js.statement(
1171+
'(function() {}).prototype = #', [_libraries[_currentLibrary!]]));
11661172
_staticTypeContext.leaveLibrary(_currentLibrary!);
11671173
}
11681174

0 commit comments

Comments
 (0)