mirror of
https://github.com/duke-git/lancet.git
synced 2025-09-26 19:41:20 +08:00
Pre-allocate memory to reduce the number of allocations (#272)
This commit is contained in:
@@ -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, "")
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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])
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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)
|
||||||
|
@@ -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]))
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
|
@@ -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])
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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))
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user