Fix RemoteArchive performance by adding bulk read methods#6377
Merged
Conversation
knutwannheden
approved these changes
Dec 4, 2025
InputStream wrappers only overrode read(), causing Files.copy() to fall back to single-byte reads. For large archives (e.g. 129MB Gradle distribution), this resulted in ~135 million read calls instead of ~2000 bulk reads - a 665x slowdown.
5e84009 to
d101c3b
Compare
shanman190
approved these changes
Dec 4, 2025
This was referenced Dec 4, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
RemoteArchive.getInputStream()creates InputStream wrappers that only override the single-byteread()method. WhenRemoteArtifactCachecopies the downloaded archive to disk usingFiles.copy(), it falls back to single-byte reads instead of using bulkread(byte[], int, int).For large archives like the Gradle distribution (129MB), this results in ~135 million individual read calls instead of ~2000 bulk reads, causing a 665x slowdown.
Solution
Add bulk read method
read(byte[], int, int)to both InputStream wrappers:readIntoArchive()Benchmark results
Tested with gradle-9.2.1-bin.zip (129MB):