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.
Overview
Avoid some data-copies -- having lots of little mallocs (even with bounded heap) doesn't work as well in Go as in C.
Idea is for
z = x + y
, instead offunc MlrvalPlus(input1, input2 *Mlrval) Mlrval
, dofunc MlrvalPlus(output, input1, input2 *Mlrval)
where theoutput
space is pre-allocated for each relevant CST node.Details
duffcopy
andmadvise
taking CPU cyclesu/mand.mlr
: issue is allocation created by expressionstype BinaryFunc func(input1 *Mlrval, input2 *Mlrval) (output Mlrval)
z = 2 + x + 4 + y * 3
results in AST, mapped to a CST, with a malloc on the output of every unary/binary/ternary functiontype BinaryFunc func(output* Mlrval, input1 *Mlrval, input2 *Mlrval)
: no allocation at all.type BinaryFunc func(input1 *Mlrval, input2 *Mlrval) (output *Mlrval)
: better.Sweet spot around 500. Note https://golang.org/pkg/runtime/debug/#SetGCPercent.
How to control garbage collection