Skip to content

Improve Deserialization Performance for Bitstream Files #236

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

Merged
merged 8 commits into from
Jun 30, 2021

Conversation

CodaFi
Copy link
Contributor

@CodaFi CodaFi commented Jun 29, 2021

Switch to a non-owning intermediate representation to allow the caller to perform the necessary copies when it reinterprets the raw data we provide to them in the visitor. This meant removing the remaining entry points that could possibly allow unowned data to escape - so the initializers on Bitstream that ran the CollectingVisitor have been struck - as well as the existing deprecated APIs here that we no longer need.

The combo of all of the changes here improves the performance of dependency graph deserialization in the Swift driver by 3-5x which translates to a 3-5 second wall time improvement for large projects (> 1000 files).

CodaFi added 5 commits June 28, 2021 23:51
These conveniences allowed a custom collector to escape the data in a bitstream container. But we don't really need them - the user can write their own visitor if need be. And these escaped elements are forcing copies in the visitor interface.
Now that we no longer have any entrypoints that can escape this data, switch to a non-owning view of bitstream data. This saves a significant amount of copying overhead when deserializing many/large bitstream files and allows callers to decide for themselves what format they wish to reinterpret the data as.
Creating a buffer of elements then reinterpreting them as unicode scalars involves extra allocations and copies of the underlying data. Instead, create a scratch buffer for an array of bytes and write directly into that.
This improves the performance of appending strings to the bitstream writer somewhat by giving us some room to work with.
@CodaFi
Copy link
Contributor Author

CodaFi commented Jun 29, 2021

@swift-ci test

@CodaFi
Copy link
Contributor Author

CodaFi commented Jun 30, 2021

@swift-ci test

An unfortunate stopgap that restores the existing beahvior of passing
around owned data.
@CodaFi
Copy link
Contributor Author

CodaFi commented Jun 30, 2021

@swift-ci test

@CodaFi
Copy link
Contributor Author

CodaFi commented Jun 30, 2021

@CodaFi
Copy link
Contributor Author

CodaFi commented Jun 30, 2021

@CodaFi CodaFi merged commit 83dce6e into swiftlang:main Jun 30, 2021
@CodaFi CodaFi deleted the perfmon branch June 30, 2021 21:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants