-
Couldn't load subscription status.
- Fork 4.3k
fix: lazy loading to improve startup time slows down large programs #35335
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This PR is a bit speculative; we think that the lazy property getters we
inject to avoid having to read all files of the entire `aws-cdk-lib`
library upon module loading (so to speed up
time-to-executing-first-statement) is adding significant overhead for
programs with a large number of statements.
Roughly:
```ts
// This avoids having to read the './core' module at startup, only do it
// if and when 'AspectPriority' gets accessed
Object.defineProperty(exports, "AspectPriority", { get: () => require("./core").AspectPriority });
```
However, the result of this is that every property access requires
running one or more getters (one for every level of indirecting file).
This may have a noticeable effect, on the order of ~1us per property
access.
To cut down on that, we will do the lazy getters differently: after
the initial lazy load, we overwrite the getter with the actual value.
That way subsequent accesses can bypass the getters and be fast:
```ts
// Only execute getter on first access
Object.defineProperty(exports, "AspectPriority", { get: () => {
const value = require("./core").AspectPriority;
// Overwrite getter with real value once we have it
Object.defineProperty(exports, "AspectPriority", { value });
return value;
});
```
This should achieve both goals of fast initial load and high throughput
for subsequent accesses.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(This review is outdated)
✅ Updated pull request passes all PRLinter validations. Dismissing previous PRLinter review.
|
Confirmed that it has the desired effect on a large CDK app inside Amazon |
|
Thank you for contributing! Your pull request will be updated from main and then merged automatically (do not update manually, and be sure to allow changes to be pushed to your fork). |
|
Thank you for contributing! Your pull request will be updated from main and then merged automatically (do not update manually, and be sure to allow changes to be pushed to your fork). |
|
Comments on closed issues and PRs are hard for our team to see. |
The lazy property getters we inject to avoid having to read all files of the entire
aws-cdk-liblibrary upon module loading (so to speed uptime-to-executing-first-statement) is adding significant overhead for programs with a large number of statements.
Roughly:
However, the result of this is that every property access requires running one or more getters (one for every level of indirecting file). This may have a noticeable effect, on the order of ~1us per property access.
To cut down on that, we will do the lazy getters differently: after the initial lazy load, we overwrite the getter with the actual value. That way subsequent accesses can bypass the getters and be fast:
This should achieve both goals of fast initial load and high throughput for subsequent accesses.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license