-
Notifications
You must be signed in to change notification settings - Fork 113
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
Tunes the initial size of various reusable ArrayLists to reduce required growth when processing real-world data. #1048
base: ion-11-encoding-optimize-initial-expression-array-size-session-pools-merge-presencebitmap-pool-no-lambdas-no-arraylistitr
Are you sure you want to change the base?
Conversation
…red growth when processing real-world data.
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.
I think it would be helpful to add comments which lead to how this was tuned/chosen. Perhaps that's redundant, please feel free to take or leave at your discretion. I just note that the commit says "tune" but doesn't describe how these numbers were selected. The PR description/thread can at least be added to later so that indirection is useful.
@@ -1221,7 +1221,7 @@ private class EncodingDirectiveReader { | |||
|
|||
boolean isSymbolTableAppend = false; | |||
boolean isMacroTableAppend = false; | |||
List<String> newSymbols = new ArrayList<>(8); | |||
List<String> newSymbols = new ArrayList<>(128); |
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.
List<String> newSymbols = new ArrayList<>(128); | |
List<String> newSymbols = new ArrayList<>(128); // ion-java #1048 |
@@ -25,7 +25,7 @@ public abstract class EExpressionArgsReader { | |||
private final ReaderAdapter reader; | |||
|
|||
// Reusable sink for expressions. | |||
protected final List<Expression.EExpressionBodyExpression> expressions = new ArrayList<>(16); | |||
protected final List<Expression.EExpressionBodyExpression> expressions = new ArrayList<>(128); |
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.
protected final List<Expression.EExpressionBodyExpression> expressions = new ArrayList<>(128); | |
protected final List<Expression.EExpressionBodyExpression> expressions = new ArrayList<>(128); // ion-java #1048 |
private val signature: MutableList<Macro.Parameter> = ArrayList(16) | ||
private val expressions: MutableList<TemplateBodyExpression> = ArrayList(64) |
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.
private val signature: MutableList<Macro.Parameter> = ArrayList(16) | |
private val expressions: MutableList<TemplateBodyExpression> = ArrayList(64) | |
private val signature: MutableList<Macro.Parameter> = ArrayList(16) // ion-java #1048 | |
private val expressions: MutableList<TemplateBodyExpression> = ArrayList(64) // ion-java #1048 |
@@ -55,7 +55,7 @@ class MacroEvaluator { | |||
/** Pool of [Expression] to minimize allocation and garbage collection. */ | |||
val expressionPool: PooledExpressionFactory = PooledExpressionFactory() | |||
/** Pool of [ExpansionInfo] to minimize allocation and garbage collection. */ | |||
private val expanderPool: ArrayList<ExpansionInfo> = ArrayList(32) | |||
private val expanderPool: ArrayList<ExpansionInfo> = ArrayList(64) |
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.
private val expanderPool: ArrayList<ExpansionInfo> = ArrayList(64) | |
private val expanderPool: ArrayList<ExpansionInfo> = ArrayList(64) // ion-java #1048 |
Description of changes:
Growing each of these arrays was the number 4 contributor to allocation rate in profiles of real-world data. We can continue to tune these values as we profile a larger corpus of data, but these are the best ones we have right now.
Speed: 216 ms/op -> 215 ms/op (~0%)
Allocation rate: 110 KB/op -> 107 KB/op (-2.7%)
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.