Implements the concept of "mass concatenation" with a new, specialized ASTNode #10
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.
One common issue with most implementations of a concatenation operator is that it's left-associative and sequential, just like any typical operator.
A .. B .. C .. D
allocates into memory A, then AB, then ABC, then ABCD, on and on. For very long runs of successive concatenation, this can cause very large and unnecessary reallocation events for each iteration of the process.This patch changes the behaviour of these to forgo the typical behaviour of binary operations in favour of a "single-batch" approach, where each operand is evaluated and appended to a master string, with the goal of making the number of allocations at least semi-linear with the number of operands.
I'm not wholly satisfied with this implementation, but it's a good step towards reducing the amount of redundant malloc/free calls currently littering the João project at the moment.
This PR made this script run twice as fast compared to the
main
branch: