Pre-allocate memory to reduce the number of allocations (#272)

This commit is contained in:
Yurun
2024-11-27 14:58:02 +08:00
committed by GitHub
parent 1eb793420e
commit 05b85a2131
12 changed files with 15 additions and 12 deletions

View File

@@ -74,7 +74,7 @@ func ToBytes(value any) ([]byte, error) {
// ToChar convert string to char slice. // ToChar convert string to char slice.
// Play: https://go.dev/play/p/JJ1SvbFkVdM // Play: https://go.dev/play/p/JJ1SvbFkVdM
func ToChar(s string) []string { func ToChar(s string) []string {
c := make([]string, 0) c := make([]string, 0, len(s))
if len(s) == 0 { if len(s) == 0 {
c = append(c, "") c = append(c, "")
} }

View File

@@ -209,7 +209,7 @@ func (dl *DoublyLink[T]) Size() int {
// Values return slice of all doubly linklist node value // Values return slice of all doubly linklist node value
func (dl *DoublyLink[T]) Values() []T { func (dl *DoublyLink[T]) Values() []T {
result := []T{} result := make([]T, 0, dl.length)
current := dl.Head current := dl.Head
for current != nil { for current != nil {
result = append(result, current.Value) result = append(result, current.Value)

View File

@@ -212,7 +212,7 @@ func (sl *SinglyLink[T]) Size() int {
// Values return slice of all singly linklist node value // Values return slice of all singly linklist node value
func (sl *SinglyLink[T]) Values() []T { func (sl *SinglyLink[T]) Values() []T {
result := []T{} result := make([]T, 0, sl.length)
current := sl.Head current := sl.Head
for current != nil { for current != nil {
result = append(result, current.Value) result = append(result, current.Value)

View File

@@ -31,7 +31,7 @@ func NewArrayQueue[T any](capacity int) *ArrayQueue[T] {
// Data return slice of queue data // Data return slice of queue data
func (q *ArrayQueue[T]) Data() []T { func (q *ArrayQueue[T]) Data() []T {
items := []T{} items := make([]T, 0, q.tail-q.head)
for i := q.head; i < q.tail; i++ { for i := q.head; i < q.tail; i++ {
items = append(items, q.data[i]) items = append(items, q.data[i])
} }

View File

@@ -27,7 +27,7 @@ func NewLinkedQueue[T any]() *LinkedQueue[T] {
// Data return slice of queue data // Data return slice of queue data
func (q *LinkedQueue[T]) Data() []T { func (q *LinkedQueue[T]) Data() []T {
res := []T{} res := make([]T, 0, q.length)
current := q.head current := q.head
for current != nil { for current != nil {

View File

@@ -24,7 +24,7 @@ func NewLinkedStack[T any]() *LinkedStack[T] {
// Data return stack data // Data return stack data
func (s *LinkedStack[T]) Data() []T { func (s *LinkedStack[T]) Data() []T {
res := []T{} res := make([]T, 0, s.length)
current := s.top current := s.top
for current != nil { for current != nil {

View File

@@ -147,7 +147,7 @@ func printTreeNodes[T any](nodes []*datastructure.TreeNode[T], level, maxLevel i
printSpaces(firstSpaces) printSpaces(firstSpaces)
newNodes := []*datastructure.TreeNode[T]{} newNodes := make([]*datastructure.TreeNode[T], 0, len(nodes)*2)
for _, node := range nodes { for _, node := range nodes {
if node != nil { if node != nil {
fmt.Printf("%v", node.Value) fmt.Printf("%v", node.Value)

View File

@@ -14,7 +14,6 @@ import (
"encoding/csv" "encoding/csv"
"errors" "errors"
"fmt" "fmt"
"github.com/duke-git/lancet/v2/validator"
"io" "io"
"io/fs" "io/fs"
"net/http" "net/http"
@@ -24,6 +23,8 @@ import (
"sort" "sort"
"strings" "strings"
"sync" "sync"
"github.com/duke-git/lancet/v2/validator"
) )
// FileReader is a reader supporting offset seeking and reading one // FileReader is a reader supporting offset seeking and reading one
@@ -819,6 +820,7 @@ func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingF
if len(headers) > 0 { if len(headers) > 0 {
columnHeaders = headers[0] columnHeaders = headers[0]
} else { } else {
columnHeaders = make([]string, 0, len(records[0]))
for key := range records[0] { for key := range records[0] {
columnHeaders = append(columnHeaders, key) columnHeaders = append(columnHeaders, key)
} }
@@ -832,7 +834,7 @@ func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingF
} }
for _, record := range records { for _, record := range records {
var row []string row := make([]string, 0, len(columnHeaders))
for _, h := range columnHeaders { for _, h := range columnHeaders {
row = append(row, fmt.Sprintf("%v", record[h])) row = append(row, fmt.Sprintf("%v", record[h]))
} }

View File

@@ -71,7 +71,7 @@ func ConvertMapToQueryString(param map[string]any) string {
if param == nil { if param == nil {
return "" return ""
} }
var keys []string keys := make([]string, 0, len(param))
for key := range param { for key := range param {
keys = append(keys, key) keys = append(keys, key)
} }

View File

@@ -202,6 +202,7 @@ func (s Stream[T]) Skip(n int) Stream[T] {
return FromSlice(source) return FromSlice(source)
} }
source = make([]T, 0, l-n)
for i := n; i < l; i++ { for i := n; i < l; i++ {
source = append(source, s.source[i]) source = append(source, s.source[i])
} }

View File

@@ -88,8 +88,8 @@ func (s *Struct) ToMap() (map[string]any, error) {
// Fields returns all the struct fields within a slice // Fields returns all the struct fields within a slice
func (s *Struct) Fields() []*Field { func (s *Struct) Fields() []*Field {
var fields []*Field
fieldNum := s.rvalue.NumField() fieldNum := s.rvalue.NumField()
fields := make([]*Field, 0, fieldNum)
for i := 0; i < fieldNum; i++ { for i := 0; i < fieldNum; i++ {
v := s.rvalue.Field(i) v := s.rvalue.Field(i)
sf := s.rtype.Field(i) sf := s.rtype.Field(i)

View File

@@ -34,7 +34,7 @@ func Wrap(cause error, message ...any) *XError {
err := newXError() err := newXError()
if len(message) > 0 { if len(message) > 0 {
var newMsgs []string newMsgs := make([]string, 0, len(message))
for _, m := range message { for _, m := range message {
newMsgs = append(newMsgs, fmt.Sprintf("%v", m)) newMsgs = append(newMsgs, fmt.Sprintf("%v", m))
} }