mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-10 16:30:01 +08:00
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:
committed by
GitHub
parent
a2b98dbcf7
commit
130e1ba963
@@ -316,7 +316,7 @@ func toLowerCaseInterface(v any, info *fieldInfo) any {
|
||||
case map[string]any:
|
||||
return toLowerCaseKeyMap(vv, info)
|
||||
case []any:
|
||||
var arr []any
|
||||
arr := make([]any, 0, len(vv))
|
||||
for _, vvv := range vv {
|
||||
arr = append(arr, toLowerCaseInterface(vvv, info))
|
||||
}
|
||||
|
||||
@@ -207,7 +207,7 @@ func (c *cluster) getCurrent(key watchKey) []KV {
|
||||
return nil
|
||||
}
|
||||
|
||||
var kvs []KV
|
||||
kvs := make([]KV, 0, len(watcher.values))
|
||||
for k, v := range watcher.values {
|
||||
kvs = append(kvs, KV{
|
||||
Key: k,
|
||||
@@ -308,7 +308,7 @@ func (c *cluster) load(cli EtcdClient, key watchKey) int64 {
|
||||
time.Sleep(coolDownUnstable.AroundDuration(coolDownInterval))
|
||||
}
|
||||
|
||||
var kvs []KV
|
||||
kvs := make([]KV, 0, len(resp.Kvs))
|
||||
for _, ev := range resp.Kvs {
|
||||
kvs = append(kvs, KV{
|
||||
Key: string(ev.Key),
|
||||
@@ -352,7 +352,7 @@ func (c *cluster) reload(cli EtcdClient) {
|
||||
// cancel the previous watches
|
||||
close(c.done)
|
||||
c.watchGroup.Wait()
|
||||
var keys []watchKey
|
||||
keys := make([]watchKey, 0, len(c.watchers))
|
||||
for wk, wval := range c.watchers {
|
||||
keys = append(keys, wk)
|
||||
if wval.cancel != nil {
|
||||
|
||||
@@ -211,7 +211,7 @@ func (r *SizeLimitRotateRule) OutdatedFiles() []string {
|
||||
}
|
||||
}
|
||||
|
||||
var result []string
|
||||
result := make([]string, 0, len(outdated))
|
||||
for k := range outdated {
|
||||
result = append(result, k)
|
||||
}
|
||||
|
||||
@@ -1944,7 +1944,7 @@ func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (int64, er
|
||||
return 0, err
|
||||
}
|
||||
|
||||
var zs []red.Z
|
||||
zs := make([]red.Z, 0, len(ps))
|
||||
for _, p := range ps {
|
||||
z := red.Z{Score: float64(p.Score), Member: p.Key}
|
||||
zs = append(zs, z)
|
||||
|
||||
@@ -392,8 +392,8 @@ func (s *sseMcpServer) processListTools(ctx context.Context, client *mcpClient,
|
||||
}
|
||||
}
|
||||
|
||||
var toolsList []Tool
|
||||
s.toolsLock.Lock()
|
||||
toolsList := make([]Tool, 0, len(s.tools))
|
||||
for _, tool := range s.tools {
|
||||
if len(tool.InputSchema.Type) == 0 {
|
||||
tool.InputSchema.Type = ContentTypeObject
|
||||
@@ -437,8 +437,8 @@ func (s *sseMcpServer) processListPrompts(ctx context.Context, client *mcpClient
|
||||
}
|
||||
|
||||
// Prepare prompt list
|
||||
var promptsList []Prompt
|
||||
s.promptsLock.Lock()
|
||||
promptsList := make([]Prompt, 0, len(s.prompts))
|
||||
for _, prompt := range s.prompts {
|
||||
promptsList = append(promptsList, prompt)
|
||||
}
|
||||
@@ -475,8 +475,8 @@ func (s *sseMcpServer) processListResources(ctx context.Context, client *mcpClie
|
||||
}
|
||||
}
|
||||
|
||||
var resourcesList []Resource
|
||||
s.resourcesLock.Lock()
|
||||
resourcesList := make([]Resource, 0, len(s.resources))
|
||||
for _, resource := range s.resources {
|
||||
// Create a copy without the handler function which shouldn't be sent to clients
|
||||
resourceCopy := Resource{
|
||||
|
||||
@@ -250,8 +250,9 @@ func extractPositionalParamsFromPath(route spec.Route) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
var params []string
|
||||
for _, member := range ds.GetTagMembers(pathTagKey) {
|
||||
tagMembers := ds.GetTagMembers(pathTagKey)
|
||||
params := make([]string, 0, len(tagMembers))
|
||||
for _, member := range tagMembers {
|
||||
dartType := member.Type.Name()
|
||||
params = append(params, fmt.Sprintf("%s %s", dartType, getPropertyFromMember(member)))
|
||||
}
|
||||
|
||||
@@ -36,13 +36,13 @@ func genConfig(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||
}
|
||||
|
||||
authNames := getAuths(api)
|
||||
var auths []string
|
||||
auths := make([]string, 0, len(authNames))
|
||||
for _, item := range authNames {
|
||||
auths = append(auths, fmt.Sprintf("%s %s", item, jwtTemplate))
|
||||
}
|
||||
|
||||
jwtTransNames := getJwtTrans(api)
|
||||
var jwtTransList []string
|
||||
jwtTransList := make([]string, 0, len(jwtTransNames))
|
||||
for _, item := range jwtTransNames {
|
||||
jwtTransList = append(jwtTransList, fmt.Sprintf("%s %s", item, jwtTransTemplate))
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ func genMain(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||
}
|
||||
|
||||
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, handlerDir)))
|
||||
imports = append(imports, fmt.Sprintf("\"%s\"\n", pathx.JoinPackages(parentPkg, contextDir)))
|
||||
|
||||
@@ -154,7 +154,7 @@ func genTypesWithGroup(dir string, cfg *config.Config, api *spec.ApiSpec) error
|
||||
}
|
||||
|
||||
for group, typeGroup := range groupTypes {
|
||||
var types []spec.Type
|
||||
types := make([]spec.Type, 0, len(typeGroup))
|
||||
for _, v := range typeGroup {
|
||||
types = append(types, v)
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ func (v *ApiVisitor) VisitTypeLit(ctx *api.TypeLitContext) any {
|
||||
// VisitTypeBlock implements from api.BaseApiParserVisitor
|
||||
func (v *ApiVisitor) VisitTypeBlock(ctx *api.TypeBlockContext) any {
|
||||
list := ctx.AllTypeBlockBody()
|
||||
var types []TypeExpr
|
||||
types := make([]TypeExpr, 0, len(list))
|
||||
for _, each := range list {
|
||||
types = append(types, each.Accept(v).(TypeExpr))
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ func (p parser) fillTypes() error {
|
||||
for _, item := range p.ast.Type {
|
||||
switch v := (item).(type) {
|
||||
case *ast.TypeStruct:
|
||||
var members []spec.Member
|
||||
members := make([]spec.Member, 0, len(v.Fields))
|
||||
for _, item := range v.Fields {
|
||||
members = append(members, p.fieldToMember(item))
|
||||
}
|
||||
|
||||
@@ -20,11 +20,11 @@ const (
|
||||
var definedKeys = []string{bodyTagKey, formTagKey, pathTagKey, headerTagKey}
|
||||
|
||||
func (s Service) JoinPrefix() Service {
|
||||
var groups []Group
|
||||
groups := make([]Group, 0, len(s.Groups))
|
||||
for _, g := range s.Groups {
|
||||
prefix := strings.TrimSpace(g.GetAnnotation(RoutePrefixKey))
|
||||
prefix = strings.ReplaceAll(prefix, `"`, "")
|
||||
var routes []Route
|
||||
routes := make([]Route, 0, len(g.Routes))
|
||||
for _, r := range g.Routes {
|
||||
r.Path = path.Join("/", prefix, r.Path)
|
||||
routes = append(routes, r)
|
||||
|
||||
@@ -66,7 +66,7 @@ func (t *Tags) Keys() []string {
|
||||
if t == nil {
|
||||
return []string{}
|
||||
}
|
||||
var keys []string
|
||||
keys := make([]string, 0, len(t.tags))
|
||||
for _, tag := range t.tags {
|
||||
keys = append(keys, tag.Key)
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ func fillAllStructs(api *spec.ApiSpec) {
|
||||
}
|
||||
|
||||
for _, group := range api.Service.Groups {
|
||||
var routes []spec.Route
|
||||
routes := make([]spec.Route, 0, len(group.Routes))
|
||||
for _, route := range group.Routes {
|
||||
route.RequestType = fillStruct("", route.RequestType, 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
|
||||
return val
|
||||
case spec.NestedStruct:
|
||||
var members []spec.Member
|
||||
members := make([]spec.Member, 0, len(val.Members))
|
||||
for _, member := range val.Members {
|
||||
switch memberType := member.Type.(type) {
|
||||
case spec.PointerType:
|
||||
|
||||
@@ -67,11 +67,11 @@ func enumsValueFromOptions(options []string) []any {
|
||||
}
|
||||
for _, option := range options {
|
||||
if strings.HasPrefix(option, enumFlag) {
|
||||
var resp = make([]any, 0)
|
||||
val := option[8:]
|
||||
fields := util.FieldsAndTrimSpace(val, func(r rune) bool {
|
||||
return r == '|'
|
||||
})
|
||||
var resp = make([]any, 0, len(fields))
|
||||
for _, field := range fields {
|
||||
resp = append(resp, field)
|
||||
}
|
||||
|
||||
@@ -244,7 +244,7 @@ func isOptional(_ Context, options []string) bool {
|
||||
|
||||
func pathVariable2SwaggerVariable(_ Context, path string) string {
|
||||
pathItems := strings.FieldsFunc(path, slashRune)
|
||||
var resp []string
|
||||
resp := make([]string, 0, len(pathItems))
|
||||
for _, v := range pathItems {
|
||||
if strings.HasPrefix(v, ":") {
|
||||
resp = append(resp, "{"+v[1:]+"}")
|
||||
|
||||
@@ -90,7 +90,7 @@ func ToUpperCase(r rune) rune {
|
||||
|
||||
// ToLower returns a copy string by converting it into lower
|
||||
func ToLower(s string) string {
|
||||
var out []rune
|
||||
out := make([]rune, 0, len(s))
|
||||
for _, r := range s {
|
||||
out = append(out, ToLowerCase(r))
|
||||
}
|
||||
@@ -99,7 +99,7 @@ func ToLower(s string) string {
|
||||
|
||||
// ToUpper returns a copy string by converting it into upper
|
||||
func ToUpper(s string) string {
|
||||
var out []rune
|
||||
out := make([]rune, 0, len(s))
|
||||
for _, r := range s {
|
||||
out = append(out, ToUpperCase(r))
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ func (p pattern) Match(s string) bool {
|
||||
}
|
||||
|
||||
func (p pattern) list() []string {
|
||||
var ret []string
|
||||
ret := make([]string, 0, len(p))
|
||||
for v := range p {
|
||||
ret = append(ret, v)
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ type Join []string
|
||||
|
||||
func genCacheKeys(prefix string, table parser.Table) (Key, []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})
|
||||
for _, each := range table.UniqueIndex {
|
||||
uniqueKey = append(uniqueKey, genCacheKey(prefix, table.Db, table.Name, each))
|
||||
|
||||
Reference in New Issue
Block a user