mirror of
https://github.com/google/go-jsonnet.git
synced 2025-08-07 14:57:24 +02:00
perf: add size hint to map creation
in order to avoid unnecessary hashmap resizing, add size parameters when creating maps
This commit is contained in:
parent
cb3a759621
commit
c450a168d4
@ -13,7 +13,7 @@ type IdentifierSet map[Identifier]struct{}
|
||||
|
||||
// NewIdentifierSet creates and returns a reference to an empty set.
|
||||
func NewIdentifierSet(a ...Identifier) IdentifierSet {
|
||||
s := make(IdentifierSet)
|
||||
s := make(IdentifierSet, len(a))
|
||||
for _, i := range a {
|
||||
s.Add(i)
|
||||
}
|
||||
|
@ -1386,7 +1386,7 @@ type builtin interface {
|
||||
}
|
||||
|
||||
func flattenArgs(args callArguments, params []namedParameter, defaults []value) []*cachedThunk {
|
||||
positions := make(map[ast.Identifier]int)
|
||||
positions := make(map[ast.Identifier]int, len(params))
|
||||
for i, param := range params {
|
||||
positions[param.name] = i
|
||||
}
|
||||
@ -1606,7 +1606,7 @@ var uopBuiltins = []*unaryBuiltin{
|
||||
}
|
||||
|
||||
func buildBuiltinMap(builtins []builtin) map[string]evalCallable {
|
||||
result := make(map[string]evalCallable)
|
||||
result := make(map[string]evalCallable, len(builtins))
|
||||
for _, b := range builtins {
|
||||
result[string(b.Name())] = b
|
||||
}
|
||||
|
@ -226,7 +226,7 @@ func (s *callStack) getCurrentEnv(ast ast.Node) environment {
|
||||
|
||||
// Build a binding frame containing specified variables.
|
||||
func (s *callStack) capture(freeVars ast.Identifiers) bindingFrame {
|
||||
env := make(bindingFrame)
|
||||
env := make(bindingFrame, len(freeVars))
|
||||
for _, fv := range freeVars {
|
||||
env[fv] = s.lookUpVarOrPanic(fv)
|
||||
}
|
||||
@ -265,7 +265,7 @@ type interpreter struct {
|
||||
|
||||
// Map union, b takes precedence when keys collide.
|
||||
func addBindings(a, b bindingFrame) bindingFrame {
|
||||
result := make(bindingFrame)
|
||||
result := make(bindingFrame, len(a))
|
||||
|
||||
for k, v := range a {
|
||||
result[k] = v
|
||||
@ -390,7 +390,7 @@ func (i *interpreter) evaluate(a ast.Node, tc tailCallStatus) (value, error) {
|
||||
|
||||
case *ast.DesugaredObject:
|
||||
// Evaluate all the field names. Check for null, dups, etc.
|
||||
fields := make(simpleObjectFieldMap)
|
||||
fields := make(simpleObjectFieldMap, len(node.Fields))
|
||||
for _, field := range node.Fields {
|
||||
fieldNameValue, err := i.evaluate(field.Name, nonTailCall)
|
||||
if err != nil {
|
||||
@ -512,7 +512,7 @@ func (i *interpreter) evaluate(a ast.Node, tc tailCallStatus) (value, error) {
|
||||
return makeValueString(node.Value), nil
|
||||
|
||||
case *ast.Local:
|
||||
vars := make(bindingFrame)
|
||||
vars := make(bindingFrame, len(node.Binds))
|
||||
bindEnv := i.stack.getCurrentEnv(a)
|
||||
for _, bind := range node.Binds {
|
||||
th := cachedThunk{env: &bindEnv, body: bind.Body}
|
||||
@ -724,7 +724,7 @@ func (i *interpreter) manifestJSON(v value) (interface{}, error) {
|
||||
}
|
||||
i.stack.clearCurrentTrace()
|
||||
|
||||
result := make(map[string]interface{})
|
||||
result := make(map[string]interface{}, len(fieldNames))
|
||||
|
||||
for _, fieldName := range fieldNames {
|
||||
msg := ast.MakeLocationRangeMessage(fmt.Sprintf("Field %#v", fieldName))
|
||||
|
@ -110,7 +110,7 @@ type bindingsUnboundField struct {
|
||||
}
|
||||
|
||||
func (f *bindingsUnboundField) evaluate(i *interpreter, sb selfBinding, origBindings bindingFrame, fieldName string) (value, error) {
|
||||
upValues := make(bindingFrame)
|
||||
upValues := make(bindingFrame, len(origBindings)+len(f.bindings))
|
||||
for variable, pvalue := range origBindings {
|
||||
upValues[variable] = pvalue
|
||||
}
|
||||
@ -192,7 +192,7 @@ func forceThunks(i *interpreter, args *bindingFrame) error {
|
||||
}
|
||||
|
||||
func (closure *closure) evalCall(arguments callArguments, i *interpreter) (value, error) {
|
||||
argThunks := make(bindingFrame)
|
||||
argThunks := make(bindingFrame, len(arguments.named)+len(arguments.positional))
|
||||
parameters := closure.parameters()
|
||||
for i, arg := range arguments.positional {
|
||||
argThunks[parameters[i].name] = arg
|
||||
|
14
value.go
14
value.go
@ -354,22 +354,22 @@ func (f *valueFunction) parameters() []namedParameter {
|
||||
}
|
||||
|
||||
func checkArguments(i *interpreter, args callArguments, params []namedParameter) error {
|
||||
|
||||
numPassed := len(args.positional)
|
||||
numPositional := len(args.positional)
|
||||
numNamed := len(args.named)
|
||||
maxExpected := len(params)
|
||||
|
||||
if numPassed > maxExpected {
|
||||
return i.Error(fmt.Sprintf("function expected %v positional argument(s), but got %v", maxExpected, numPassed))
|
||||
if numPositional > maxExpected {
|
||||
return i.Error(fmt.Sprintf("function expected %v positional argument(s), but got %v", maxExpected, numPositional))
|
||||
}
|
||||
|
||||
// Parameter names the function will accept.
|
||||
accepted := make(map[ast.Identifier]bool)
|
||||
accepted := make(map[ast.Identifier]bool, maxExpected)
|
||||
for _, param := range params {
|
||||
accepted[param.name] = true
|
||||
}
|
||||
|
||||
// Parameter names the call will bind.
|
||||
received := make(map[ast.Identifier]bool)
|
||||
received := make(map[ast.Identifier]bool, numPositional+numNamed)
|
||||
for i := range args.positional {
|
||||
received[params[i].name] = true
|
||||
}
|
||||
@ -681,7 +681,7 @@ func findField(curr uncachedObject, minSuperDepth int, f string) (bool, simpleOb
|
||||
}
|
||||
|
||||
func prepareFieldUpvalues(sb selfBinding, upValues bindingFrame, locals []objectLocal) bindingFrame {
|
||||
newUpValues := make(bindingFrame)
|
||||
newUpValues := make(bindingFrame, len(upValues))
|
||||
for k, v := range upValues {
|
||||
newUpValues[k] = v
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user