perf: pre-allocate all known length arrays to avoid re-scaling (#5029)

Co-authored-by: Kevin Wan <wanjunfeng@gmail.com>
This commit is contained in:
Ioannis Pinakoulakis
2025-08-08 19:03:25 +03:00
committed by GitHub
parent a2b98dbcf7
commit 130e1ba963
19 changed files with 29 additions and 28 deletions

View File

@@ -316,7 +316,7 @@ func toLowerCaseInterface(v any, info *fieldInfo) any {
case map[string]any: case map[string]any:
return toLowerCaseKeyMap(vv, info) return toLowerCaseKeyMap(vv, info)
case []any: case []any:
var arr []any arr := make([]any, 0, len(vv))
for _, vvv := range vv { for _, vvv := range vv {
arr = append(arr, toLowerCaseInterface(vvv, info)) arr = append(arr, toLowerCaseInterface(vvv, info))
} }

View File

@@ -207,7 +207,7 @@ func (c *cluster) getCurrent(key watchKey) []KV {
return nil return nil
} }
var kvs []KV kvs := make([]KV, 0, len(watcher.values))
for k, v := range watcher.values { for k, v := range watcher.values {
kvs = append(kvs, KV{ kvs = append(kvs, KV{
Key: k, Key: k,
@@ -308,7 +308,7 @@ func (c *cluster) load(cli EtcdClient, key watchKey) int64 {
time.Sleep(coolDownUnstable.AroundDuration(coolDownInterval)) time.Sleep(coolDownUnstable.AroundDuration(coolDownInterval))
} }
var kvs []KV kvs := make([]KV, 0, len(resp.Kvs))
for _, ev := range resp.Kvs { for _, ev := range resp.Kvs {
kvs = append(kvs, KV{ kvs = append(kvs, KV{
Key: string(ev.Key), Key: string(ev.Key),
@@ -352,7 +352,7 @@ func (c *cluster) reload(cli EtcdClient) {
// cancel the previous watches // cancel the previous watches
close(c.done) close(c.done)
c.watchGroup.Wait() c.watchGroup.Wait()
var keys []watchKey keys := make([]watchKey, 0, len(c.watchers))
for wk, wval := range c.watchers { for wk, wval := range c.watchers {
keys = append(keys, wk) keys = append(keys, wk)
if wval.cancel != nil { if wval.cancel != nil {

View File

@@ -211,7 +211,7 @@ func (r *SizeLimitRotateRule) OutdatedFiles() []string {
} }
} }
var result []string result := make([]string, 0, len(outdated))
for k := range outdated { for k := range outdated {
result = append(result, k) result = append(result, k)
} }

View File

@@ -1944,7 +1944,7 @@ func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (int64, er
return 0, err return 0, err
} }
var zs []red.Z zs := make([]red.Z, 0, len(ps))
for _, p := range ps { for _, p := range ps {
z := red.Z{Score: float64(p.Score), Member: p.Key} z := red.Z{Score: float64(p.Score), Member: p.Key}
zs = append(zs, z) zs = append(zs, z)

View File

@@ -392,8 +392,8 @@ func (s *sseMcpServer) processListTools(ctx context.Context, client *mcpClient,
} }
} }
var toolsList []Tool
s.toolsLock.Lock() s.toolsLock.Lock()
toolsList := make([]Tool, 0, len(s.tools))
for _, tool := range s.tools { for _, tool := range s.tools {
if len(tool.InputSchema.Type) == 0 { if len(tool.InputSchema.Type) == 0 {
tool.InputSchema.Type = ContentTypeObject tool.InputSchema.Type = ContentTypeObject
@@ -437,8 +437,8 @@ func (s *sseMcpServer) processListPrompts(ctx context.Context, client *mcpClient
} }
// Prepare prompt list // Prepare prompt list
var promptsList []Prompt
s.promptsLock.Lock() s.promptsLock.Lock()
promptsList := make([]Prompt, 0, len(s.prompts))
for _, prompt := range s.prompts { for _, prompt := range s.prompts {
promptsList = append(promptsList, prompt) promptsList = append(promptsList, prompt)
} }
@@ -475,8 +475,8 @@ func (s *sseMcpServer) processListResources(ctx context.Context, client *mcpClie
} }
} }
var resourcesList []Resource
s.resourcesLock.Lock() s.resourcesLock.Lock()
resourcesList := make([]Resource, 0, len(s.resources))
for _, resource := range s.resources { for _, resource := range s.resources {
// Create a copy without the handler function which shouldn't be sent to clients // Create a copy without the handler function which shouldn't be sent to clients
resourceCopy := Resource{ resourceCopy := Resource{

View File

@@ -250,8 +250,9 @@ func extractPositionalParamsFromPath(route spec.Route) string {
return "" return ""
} }
var params []string tagMembers := ds.GetTagMembers(pathTagKey)
for _, member := range ds.GetTagMembers(pathTagKey) { params := make([]string, 0, len(tagMembers))
for _, member := range tagMembers {
dartType := member.Type.Name() dartType := member.Type.Name()
params = append(params, fmt.Sprintf("%s %s", dartType, getPropertyFromMember(member))) params = append(params, fmt.Sprintf("%s %s", dartType, getPropertyFromMember(member)))
} }

View File

@@ -36,13 +36,13 @@ func genConfig(dir string, cfg *config.Config, api *spec.ApiSpec) error {
} }
authNames := getAuths(api) authNames := getAuths(api)
var auths []string auths := make([]string, 0, len(authNames))
for _, item := range authNames { for _, item := range authNames {
auths = append(auths, fmt.Sprintf("%s %s", item, jwtTemplate)) auths = append(auths, fmt.Sprintf("%s %s", item, jwtTemplate))
} }
jwtTransNames := getJwtTrans(api) jwtTransNames := getJwtTrans(api)
var jwtTransList []string jwtTransList := make([]string, 0, len(jwtTransNames))
for _, item := range jwtTransNames { for _, item := range jwtTransNames {
jwtTransList = append(jwtTransList, fmt.Sprintf("%s %s", item, jwtTransTemplate)) jwtTransList = append(jwtTransList, fmt.Sprintf("%s %s", item, jwtTransTemplate))
} }

View File

@@ -43,7 +43,7 @@ func genMain(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
} }
func genMainImports(parentPkg string) string { func genMainImports(parentPkg string) string {
var imports []string imports := make([]string, 0, 5)
imports = append(imports, fmt.Sprintf("\"%s\"", pathx.JoinPackages(parentPkg, configDir))) imports = append(imports, fmt.Sprintf("\"%s\"", pathx.JoinPackages(parentPkg, configDir)))
imports = append(imports, fmt.Sprintf("\"%s\"", pathx.JoinPackages(parentPkg, handlerDir))) imports = append(imports, fmt.Sprintf("\"%s\"", pathx.JoinPackages(parentPkg, handlerDir)))
imports = append(imports, fmt.Sprintf("\"%s\"\n", pathx.JoinPackages(parentPkg, contextDir))) imports = append(imports, fmt.Sprintf("\"%s\"\n", pathx.JoinPackages(parentPkg, contextDir)))

View File

@@ -154,7 +154,7 @@ func genTypesWithGroup(dir string, cfg *config.Config, api *spec.ApiSpec) error
} }
for group, typeGroup := range groupTypes { for group, typeGroup := range groupTypes {
var types []spec.Type types := make([]spec.Type, 0, len(typeGroup))
for _, v := range typeGroup { for _, v := range typeGroup {
types = append(types, v) types = append(types, v)
} }

View File

@@ -126,7 +126,7 @@ func (v *ApiVisitor) VisitTypeLit(ctx *api.TypeLitContext) any {
// VisitTypeBlock implements from api.BaseApiParserVisitor // VisitTypeBlock implements from api.BaseApiParserVisitor
func (v *ApiVisitor) VisitTypeBlock(ctx *api.TypeBlockContext) any { func (v *ApiVisitor) VisitTypeBlock(ctx *api.TypeBlockContext) any {
list := ctx.AllTypeBlockBody() list := ctx.AllTypeBlockBody()
var types []TypeExpr types := make([]TypeExpr, 0, len(list))
for _, each := range list { for _, each := range list {
types = append(types, each.Accept(v).(TypeExpr)) types = append(types, each.Accept(v).(TypeExpr))
} }

View File

@@ -125,7 +125,7 @@ func (p parser) fillTypes() error {
for _, item := range p.ast.Type { for _, item := range p.ast.Type {
switch v := (item).(type) { switch v := (item).(type) {
case *ast.TypeStruct: case *ast.TypeStruct:
var members []spec.Member members := make([]spec.Member, 0, len(v.Fields))
for _, item := range v.Fields { for _, item := range v.Fields {
members = append(members, p.fieldToMember(item)) members = append(members, p.fieldToMember(item))
} }

View File

@@ -20,11 +20,11 @@ const (
var definedKeys = []string{bodyTagKey, formTagKey, pathTagKey, headerTagKey} var definedKeys = []string{bodyTagKey, formTagKey, pathTagKey, headerTagKey}
func (s Service) JoinPrefix() Service { func (s Service) JoinPrefix() Service {
var groups []Group groups := make([]Group, 0, len(s.Groups))
for _, g := range s.Groups { for _, g := range s.Groups {
prefix := strings.TrimSpace(g.GetAnnotation(RoutePrefixKey)) prefix := strings.TrimSpace(g.GetAnnotation(RoutePrefixKey))
prefix = strings.ReplaceAll(prefix, `"`, "") prefix = strings.ReplaceAll(prefix, `"`, "")
var routes []Route routes := make([]Route, 0, len(g.Routes))
for _, r := range g.Routes { for _, r := range g.Routes {
r.Path = path.Join("/", prefix, r.Path) r.Path = path.Join("/", prefix, r.Path)
routes = append(routes, r) routes = append(routes, r)

View File

@@ -66,7 +66,7 @@ func (t *Tags) Keys() []string {
if t == nil { if t == nil {
return []string{} return []string{}
} }
var keys []string keys := make([]string, 0, len(t.tags))
for _, tag := range t.tags { for _, tag := range t.tags {
keys = append(keys, tag.Key) keys = append(keys, tag.Key)
} }

View File

@@ -19,7 +19,7 @@ func fillAllStructs(api *spec.ApiSpec) {
} }
for _, group := range api.Service.Groups { for _, group := range api.Service.Groups {
var routes []spec.Route routes := make([]spec.Route, 0, len(group.Routes))
for _, route := range group.Routes { for _, route := range group.Routes {
route.RequestType = fillStruct("", route.RequestType, structTypes) route.RequestType = fillStruct("", route.RequestType, structTypes)
route.ResponseType = fillStruct("", route.ResponseType, structTypes) route.ResponseType = fillStruct("", route.ResponseType, structTypes)
@@ -74,7 +74,7 @@ func fillStruct(parent string, tp spec.Type, allTypes map[string]spec.DefineStru
val.Members = members val.Members = members
return val return val
case spec.NestedStruct: case spec.NestedStruct:
var members []spec.Member members := make([]spec.Member, 0, len(val.Members))
for _, member := range val.Members { for _, member := range val.Members {
switch memberType := member.Type.(type) { switch memberType := member.Type.(type) {
case spec.PointerType: case spec.PointerType:

View File

@@ -67,11 +67,11 @@ func enumsValueFromOptions(options []string) []any {
} }
for _, option := range options { for _, option := range options {
if strings.HasPrefix(option, enumFlag) { if strings.HasPrefix(option, enumFlag) {
var resp = make([]any, 0)
val := option[8:] val := option[8:]
fields := util.FieldsAndTrimSpace(val, func(r rune) bool { fields := util.FieldsAndTrimSpace(val, func(r rune) bool {
return r == '|' return r == '|'
}) })
var resp = make([]any, 0, len(fields))
for _, field := range fields { for _, field := range fields {
resp = append(resp, field) resp = append(resp, field)
} }

View File

@@ -244,7 +244,7 @@ func isOptional(_ Context, options []string) bool {
func pathVariable2SwaggerVariable(_ Context, path string) string { func pathVariable2SwaggerVariable(_ Context, path string) string {
pathItems := strings.FieldsFunc(path, slashRune) pathItems := strings.FieldsFunc(path, slashRune)
var resp []string resp := make([]string, 0, len(pathItems))
for _, v := range pathItems { for _, v := range pathItems {
if strings.HasPrefix(v, ":") { if strings.HasPrefix(v, ":") {
resp = append(resp, "{"+v[1:]+"}") resp = append(resp, "{"+v[1:]+"}")

View File

@@ -90,7 +90,7 @@ func ToUpperCase(r rune) rune {
// ToLower returns a copy string by converting it into lower // ToLower returns a copy string by converting it into lower
func ToLower(s string) string { func ToLower(s string) string {
var out []rune out := make([]rune, 0, len(s))
for _, r := range s { for _, r := range s {
out = append(out, ToLowerCase(r)) out = append(out, ToLowerCase(r))
} }
@@ -99,7 +99,7 @@ func ToLower(s string) string {
// ToUpper returns a copy string by converting it into upper // ToUpper returns a copy string by converting it into upper
func ToUpper(s string) string { func ToUpper(s string) string {
var out []rune out := make([]rune, 0, len(s))
for _, r := range s { for _, r := range s {
out = append(out, ToUpperCase(r)) out = append(out, ToUpperCase(r))
} }

View File

@@ -172,7 +172,7 @@ func (p pattern) Match(s string) bool {
} }
func (p pattern) list() []string { func (p pattern) list() []string {
var ret []string ret := make([]string, 0, len(p))
for v := range p { for v := range p {
ret = append(ret, v) ret = append(ret, v)
} }

View File

@@ -39,7 +39,7 @@ type Join []string
func genCacheKeys(prefix string, table parser.Table) (Key, []Key) { func genCacheKeys(prefix string, table parser.Table) (Key, []Key) {
var primaryKey Key var primaryKey Key
var uniqueKey []Key uniqueKey := make([]Key, 0, len(table.UniqueIndex))
primaryKey = genCacheKey(prefix, table.Db, table.Name, []*parser.Field{&table.PrimaryKey.Field}) primaryKey = genCacheKey(prefix, table.Db, table.Name, []*parser.Field{&table.PrimaryKey.Field})
for _, each := range table.UniqueIndex { for _, each := range table.UniqueIndex {
uniqueKey = append(uniqueKey, genCacheKey(prefix, table.Db, table.Name, each)) uniqueKey = append(uniqueKey, genCacheKey(prefix, table.Db, table.Name, each))