Skip to content
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

Optimize Target and FieldSet operations #18917

Merged
merged 2 commits into from
May 7, 2023

Conversation

stuhood
Copy link
Member

@stuhood stuhood commented May 5, 2023

Recent profiles (from #18911, and reproduced locally) highlighted:

  • FieldSet.create was repeatedly calling the unmemoized _get_field_set_fields, which used the surprisingly expensive from typing import get_type_hints.
    • This change moves type hint extraction into a memoized property.
  • Target.has_fields was doing an N^2 lookup of fields in a computed collection of registered fields.
    • Moved to using the field_values dict to represent the set of present fields, and removed the plugin_fields property (which is always incorporated into the field_values at construction time anyway).

Performance for ./pants --no-pantsd dependencies :: in pantsbuild/pants improves by 9% (or 15%, if the time for rule graph solving is ignored).

@stuhood stuhood force-pushed the stuhood/target-and-field-set-opts branch from 4379dd1 to 68ce5d4 Compare May 5, 2023 23:51
@stuhood stuhood modified the milestones: 2.16.x, 2.15.x May 5, 2023
@stuhood stuhood marked this pull request as ready for review May 5, 2023 23:58
@stuhood
Copy link
Member Author

stuhood commented May 6, 2023

Commits are useful to review independently.

Copy link
Member

@kaos kaos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great refactorings.

Copy link
Contributor

@Eric-Arellano Eric-Arellano left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@stuhood stuhood merged commit db5f1db into pantsbuild:main May 7, 2023
@stuhood stuhood deleted the stuhood/target-and-field-set-opts branch May 7, 2023 20:20
benjyw pushed a commit to benjyw/pants that referenced this pull request May 9, 2023
Recent profiles (from pantsbuild#18911, and reproduced locally) highlighted:
* `FieldSet.create` was repeatedly calling the unmemoized
`_get_field_set_fields`, which used the surprisingly expensive `from
typing import get_type_hints`.
    * This change moves type hint extraction into a memoized property.
* `Target.has_fields` was doing an N^2 lookup of fields in a computed
collection of registered fields.
* Moved to using the `field_values` `dict` to represent the set of
present fields, and removed the `plugin_fields` property (which is
always incorporated into the `field_values` at construction time
anyway).

----

Performance for `./pants --no-pantsd dependencies ::` in
`pantsbuild/pants` improves by 9% (or 15%, if the time for rule graph
solving is ignored).
stuhood added a commit to stuhood/pants that referenced this pull request May 9, 2023
Recent profiles (from pantsbuild#18911, and reproduced locally) highlighted:
* `FieldSet.create` was repeatedly calling the unmemoized
`_get_field_set_fields`, which used the surprisingly expensive `from
typing import get_type_hints`.
    * This change moves type hint extraction into a memoized property.
* `Target.has_fields` was doing an N^2 lookup of fields in a computed
collection of registered fields.
* Moved to using the `field_values` `dict` to represent the set of
present fields, and removed the `plugin_fields` property (which is
always incorporated into the `field_values` at construction time
anyway).

----

Performance for `./pants --no-pantsd dependencies ::` in
`pantsbuild/pants` improves by 9% (or 15%, if the time for rule graph
solving is ignored).
benjyw added a commit that referenced this pull request May 9, 2023
)

Recent profiles (from #18911, and reproduced locally) highlighted:
* `FieldSet.create` was repeatedly calling the unmemoized
`_get_field_set_fields`, which used the surprisingly expensive `from
typing import get_type_hints`.
    * This change moves type hint extraction into a memoized property.
* `Target.has_fields` was doing an N^2 lookup of fields in a computed
collection of registered fields.
* Moved to using the `field_values` `dict` to represent the set of
present fields, and removed the `plugin_fields` property (which is
always incorporated into the `field_values` at construction time
anyway).

----

Performance for `./pants --no-pantsd dependencies ::` in
`pantsbuild/pants` improves by 9% (or 15%, if the time for rule graph
solving is ignored).

---------

Co-authored-by: Stu Hood <stuhood@gmail.com>
stuhood added a commit that referenced this pull request May 9, 2023
…18949)

Recent profiles (from #18911, and reproduced locally) highlighted:
* `FieldSet.create` was repeatedly calling the unmemoized
`_get_field_set_fields`, which used the surprisingly expensive `from
typing import get_type_hints`.
    * This change moves type hint extraction into a memoized property.
* `Target.has_fields` was doing an N^2 lookup of fields in a computed
collection of registered fields.
* Moved to using the `field_values` `dict` to represent the set of
present fields, and removed the `plugin_fields` property (which is
always incorporated into the `field_values` at construction time
anyway).

----

Performance for `./pants --no-pantsd dependencies ::` in
`pantsbuild/pants` improves by 9% (or 15%, if the time for rule graph
solving is ignored).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants