Description
angular/packages/compiler/src/output/output_ast.ts
Lines 1465 to 1471 in e8ae3c5
This for-in loop also iterates over the prototype chain, copying many functions from the prototypes onto the cloned object as own properties. This doesn't make sense, since the cloned object also has the right prototype, so in a way it has all these functions twice now: on the prototype chain and as own properties.
Putting a check in this loop and only copying own properties will improve performance and avoid wasting memory on unnecessary properties.
In V8 versions before 7.4 (Chrome 74, Node 12), we had an optimization that improved the situation. This is why Node.js observed a huge memory regression for Angular builds when updating V8 in Node.js 12: nodejs/node#28205
That is, we had an optimization that detected function properties that are always the same and shares them in the hidden class instead of actually putting them on the object. This is kind of V8 doing something like prototypes without the user using prototypes. When we enabled constant field tracking, which serves a similar purpose in other cases, we removed this old optimization. This results in us always putting own properties into the object, so they always consume memory, as one might expect actually.
Is this code only used for Angular builds or does it also affect webpages?
Activity
AndrewKushnir commentedon Jul 18, 2019
@tebbi thanks a lot for investigation and detailed information provided! 👍
We've created a PR to address this issue (PR #31638).
The mentioned code is only used during compilation process and is not invoked on web pages.
Thank you.
filipesilva commentedon Jul 19, 2019
@AndrewKushnir won't this compiler code also run at browser app runtime when it is using JIT compilation?
perf(compiler): avoid copying from prototype while cloning an object
perf(compiler): avoid copying from prototype while cloning an object (#…
3 remaining items