Skip to content

Commit f06da90

Browse files
committed
perf(util/CompareNumInStr): use byte slice to reduce operation latency
1 parent a468bc7 commit f06da90

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

src/serverHandler/responseData.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func sortSubItems(subItems []os.FileInfo) {
199199
return prevIsDir
200200
}
201201

202-
return util.CompareNumInStr(prevItem.Name(), nextItem.Name())
202+
return util.CompareNumInStr([]byte(prevItem.Name()), []byte(nextItem.Name()))
203203
},
204204
)
205205
}

src/util/compareNumInStr.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package util
22

33
import "bytes"
44

5-
func findCommonPrefix(prev, next string) int {
5+
func findCommonPrefix(prev, next []byte) int {
66
prevLen := len(prev)
77
nextLen := len(next)
88

@@ -22,19 +22,20 @@ func findCommonPrefix(prev, next string) int {
2222
return maxLen
2323
}
2424

25-
func extractPrefixDigits(input string) (output string) {
26-
buffer := bytes.NewBuffer(make([]byte, 0, 8))
27-
for i, length := 0, len(input); i < length; i++ {
28-
b := input[i]
25+
func extractPrefixDigits(input []byte) []byte {
26+
buf := input[0:0]
27+
28+
var prefixLen, length int
29+
for prefixLen, length = 0, len(input); prefixLen < length; prefixLen++ {
30+
b := input[prefixLen]
2931
if b < '0' || b > '9' {
3032
break
3133
}
32-
buffer.WriteByte(b)
3334
}
34-
return buffer.String()
35+
return buf[:prefixLen]
3536
}
3637

37-
func CompareNumInStr(prev, next string) bool {
38+
func CompareNumInStr(prev, next []byte) bool {
3839
if len(prev) == 0 {
3940
return true
4041
} else if len(next) == 0 {
@@ -62,13 +63,14 @@ func CompareNumInStr(prev, next string) bool {
6263
return prevDigitsLen < nextDigitsLen
6364
}
6465

65-
if prevDigitsLen == 0 {
66-
return prev < next
66+
if prevDigitsLen == 0 { // prevDigitsLen and nextDigitsLen is 0
67+
return bytes.Compare(prev, next) < 0
6768
}
6869

69-
if prevDigits == nextDigits {
70-
return CompareNumInStr(prev[prevDigitsLen:], next[nextDigitsLen:])
70+
compareResult := bytes.Compare(prevDigits, nextDigits)
71+
if compareResult != 0 {
72+
return compareResult < 0
7173
} else {
72-
return prevDigits < nextDigits
74+
return CompareNumInStr(prev[prevDigitsLen:], next[nextDigitsLen:])
7375
}
7476
}

src/util/compareNumInStr_test.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,38 @@ func TestCompareNumInStr(t *testing.T) {
77

88
prev = "2"
99
next = "3"
10-
if CompareNumInStr(prev, next) != true {
10+
if CompareNumInStr([]byte(prev), []byte(next)) != true {
1111
t.Error(prev, next)
1212
}
1313

1414
prev = "2"
1515
next = "20"
16-
if CompareNumInStr(prev, next) != true {
16+
if CompareNumInStr([]byte(prev), []byte(next)) != true {
1717
t.Error(prev, next)
1818
}
1919

2020
prev = "1.1"
2121
next = "1.10"
22-
if CompareNumInStr(prev, next) != true {
22+
if CompareNumInStr([]byte(prev), []byte(next)) != true {
2323
t.Error(prev, next)
2424
}
2525

2626
prev = "1.2"
2727
next = "1.10"
28-
if CompareNumInStr(prev, next) != true {
28+
if CompareNumInStr([]byte(prev), []byte(next)) != true {
2929
t.Error(prev, next)
3030
}
3131

3232
prev = "1.3.2"
3333
next = "1.3.10"
34-
if CompareNumInStr(prev, next) != true {
34+
if CompareNumInStr([]byte(prev), []byte(next)) != true {
3535
t.Error(prev, next)
3636
}
3737
}
38+
39+
func TestExtractPrefixDigits(t *testing.T) {
40+
result := string(extractPrefixDigits([]byte("123.haha")))
41+
if result != "123" {
42+
t.Error(result)
43+
}
44+
}

0 commit comments

Comments
 (0)