Skip to content

Commit 273beb2

Browse files
committed
perf: use strings.Builder in Plain() and Reverse()
Both functions were concatenating strings in a loop, which creates a new string allocation on each iteration - O(n²) time complexity. strings.Builder avoids this by writing to a pre-allocated buffer.
1 parent 0f02eb1 commit 273beb2

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

core/common/utils_rad.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com
22

3+
import "strings"
4+
35
func Truncate(str string, maxLen int64) string {
46
runes := []rune(str)
57
if TerminalIsUtf8 {
@@ -10,10 +12,11 @@ func Truncate(str string, maxLen int64) string {
1012
}
1113

1214
func Reverse(str string) string {
13-
runeString := []rune(str)
14-
var reverseString string
15-
for i := len(runeString) - 1; i >= 0; i-- {
16-
reverseString += string(runeString[i])
15+
runes := []rune(str)
16+
var builder strings.Builder
17+
builder.Grow(len(str))
18+
for i := len(runes) - 1; i >= 0; i-- {
19+
builder.WriteRune(runes[i])
1720
}
18-
return reverseString
21+
return builder.String()
1922
}

core/type_string.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ func (s RadString) CopyAttrTo(otherStr string) RadString {
5656
// does not apply any attributes
5757
func (s RadString) Plain() string {
5858
// todo can lazily compute and cache
59-
var result string
59+
var builder strings.Builder
6060
for _, segment := range s.Segments {
61-
result += segment.String
61+
builder.WriteString(segment.String)
6262
}
63-
return result
63+
return builder.String()
6464
}
6565

6666
// applies all the attributes

0 commit comments

Comments
 (0)