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

Adds a pool for PresenceBitmap instances. #1044

Open
wants to merge 1 commit into
base: ion-11-encoding-optimize-initial-expression-array-size-session-pools
Choose a base branch
from

Conversation

tgregg
Copy link
Contributor

@tgregg tgregg commented Jan 30, 2025

Description of changes:

This just adds a pool to the existing abstraction. We may still choose to overhaul the abstraction on the read side, as suggested here: #1032 (review)

This has a minimal effect on speed, but a fairly significant effect on allocation rate.

Speed: 245 ms/op -> 244 ms /op (~0%)
Allocation rate: 157 KB/op -> 139 KB/op (-11.5%)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@tgregg tgregg force-pushed the ion-11-encoding-optimize-initial-expression-array-size-session-pools-merge-presencebitmap-pool branch from ad7f1a8 to 76e8e2f Compare January 30, 2025 21:31
Comment on lines -94 to +132
val nonRequiredParametersCount = signature.count { it.cardinality != ParameterCardinality.ExactlyOne }
val usePresenceBits = nonRequiredParametersCount > PRESENCE_BITS_SIZE_THRESHOLD || signature.any { it.type.taglessEncodingKind != null }
var nonRequiredParametersCount = 0
var usePresenceBits = false
for (i in signature.indices) {
val parameter = signature[i]
if (parameter.cardinality != ParameterCardinality.ExactlyOne) {
nonRequiredParametersCount++
}
usePresenceBits = usePresenceBits or (parameter.type.taglessEncodingKind != null)
}
usePresenceBits = usePresenceBits or (nonRequiredParametersCount > PRESENCE_BITS_SIZE_THRESHOLD)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The result is the same, but the new (uglier) version achieves two things:

  1. It eliminates ArrayList$Itr allocations that are implicit to Kotlin's List.count and List.any methods. These were showing up prominently in memory profiles. This change alone lowered allocation rate from 147 KB/op to 139 KB/op.
  2. It only loops through the signature once, instead of (worst case) two full times.

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.

1 participant