4dc1ebc4a85b3eded812c7f7285dbed9.png

文章目录

1. 写在前面

2. 字符串比较基本方式

2.1 区分大小写

2.2 不区分大小写

2.2.1 使用strings.ToLower

2.2.2 使用strings.Compare

3. 使用EqualFold

4. 性能分析

4.1 生成数据样本

4.2 测试读取耗时

4.3 区分大小写时的耗时

==
Compare

4.3.3 结论

4.4 不区分大小写时的耗时

==
Compare

4.4.3 使用EqualFold时的耗时

5. 总结

1. 写在前面

Kubernetes
字符串比较字符串比较字符串比较

• 字符串比较的不同方式• 忽略大小的字符串比较• 不同方法的性能比较

2. 字符串比较基本方式

2.1 区分大小写

So easy
package main

import "fmt"

func main() {
srcString := "This a string"
destString := "this a string"

if srcString == destString {
fmt.Println("Equals")
} else {
fmt.Println("Not Equals")
}
}

2.2 不区分大小写

2.2.1 使用strings.ToLower

package main

import (
"fmt"
"strings"
)

func main() {
...

if strings.ToLower(srcString) == strings.ToLower(destString) {
fmt.Println("Equals")
} else {
fmt.Println("Not Equals")
}
}

2.2.2 使用strings.Compare

package main

import (
"fmt"
"strings"
)

func main() {
...
if strings.Compare(strings.ToLower(srcString), strings.ToLower(destString)) == 0 {
fmt.Println("Equals")
} else {
fmt.Println("Not Equals")
}
}
2.2.1

3. 使用EqualFold

2.2
package main

import (
"fmt"
"strings"
)

func main() {
...

if strings.EqualFold(srcString, destString) == true {
fmt.Println("Equals")
} else {
fmt.Println("Not Equals")
}
}

4. 性能分析

我们前面只是简单的给出了结论,哪种方式是比较高效的。那样是不严谨的,那么,如何来实际测试一下,看一下,到底哪种方式更加的高效呢?这一章节中,我们将会通过一个测试样本进行实际测试一下。

4.1 生成数据样本

在开始之前,我们需要所准备一个数据样本,样本的获取可以通过mockaroo[1]来得到,也可以使用以下程序来生成:

package main

import (
"crypto/rand"
"fmt"
"os"
)

func GenerateRandomString(n int) string {
const CHARACTER = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var bytes = make([]byte, n)

if _, err := rand.Read(bytes); err != nil {
panic(err)
}

for i, c := range bytes {
bytes[i] = CHARACTER[c % byte(len(CHARACTER))]
}

return string(bytes)
}

func GenFile() {
f, err := os.Create("mock_data.txt")

if err != nil {
panic(err)
}

defer f.Close()

var tempStr string

for i := 0; i < 200000; i++ {
tempStr = fmt.Sprintf("%v\n", GenerateRandomString(16))
if _, err2 := f.WriteString(tempStr); err2 != nil {
panic(err2)
}
}

}

func main() {
GenFile()
}

我们得到了一个200000行数据的数据样本:

jeffrey@hacker ~/Desktop/hello
$ cat mock_data.txt | wc -l
200000

4.2 测试读取耗时

为了测试读取文件的耗时,我们写了以下程序:

main.go
package main

import "main/utils/reader"

func main() {
//gen.GenFile()
reader.ReadFile("mock_data.txt")
}
reader.go
package reader

import (
"bufio"
"fmt"
"os"
)

func ReadFile(fileName string) {
f, err := os.Open(fileName)

if err != nil {
panic(err)
}

scan := bufio.NewScanner(f)
scan.Split(bufio.ScanLines)

for scan.Scan() {
cmptString := scan.Text()
fmt.Printf("%s\n", cmptString)
}

f.Close()
}

执行上面获取文件的代码,耗时如下:

...
IBg0Fg79uIwwX9aF
ZcLmE0v1eUqjb6yK
EH6ykTgMTiUBtg3c
aVPont9anIcYBxcW
nKj04D2QIwx1J3VA
bwDRBkuRuw6XDn2I
79rIt3yb8zp5EMRw

real 0m1.122s
user 0m0.000s
sys 0m0.015s

jeffrey@hacker ~/Desktop/hello

4.3 区分大小写时的耗时

==
==
func BasicCompare(src, dest string) bool {
if srcString == destString {
return true
} else {
return false
}
}
main.go
package main

import "main/utils/reader"

func main() {
//gen.GenFile()
reader.ReadFile("mock_data.txt")
}
reader.go
package reader

import (
"bufio"
"fmt"
"os"
)

func ReadFile(fileName string) {
srcString := "fuckSBWu"

f, err := os.Open(fileName)

if err != nil {
panic(err)
}

scan := bufio.NewScanner(f)
scan.Split(bufio.ScanLines)

for scan.Scan() {
if BasicCompare(scan.Text(), strcString) {
fmt.Println("Equal")
}
}

f.Close()
}
jeffrey@hacker ~/Desktop/hello
$ time go run main.go

real 0m0.436s
user 0m0.000s
sys 0m0.015s
Compare
func CompareCompare(src, dest string) bool {
if strings.Compare(src, dest) == 0 {
return true
}
return false
}
jeffrey@hacker ~/Desktop/hello
$ time go run main.go

real 0m0.395s
user 0m0.000s
sys 0m0.015s

4.3.3 结论

strings.Compare()略显快一些。

4.4 不区分大小写时的耗时

==
func CaseInSensitiveBasicCompare(src, dest string) bool {
if strings.ToLower(src) == strings.ToLower(dest) {
return true
} else {
return false
}
}
jeffrey@hacker ~/Desktop/hello
$ time go run main.go

real 0m0.423s
user 0m0.000s
sys 0m0.015s
Compare
func CaseInSensitiveCompareCompare(src, dest string) bool {
if strings.Compare(strings.ToLower(src), strings.ToLower(dest)) == 0 {
return true
} else {
return false
}
}
jeffrey@hacker ~/Desktop/hello
$ time go run main.go

real 0m0.426s
user 0m0.015s
sys 0m0.000s

4.4.3 使用EqualFold时的耗时

jeffrey@hacker ~/Desktop/hello
$ time go run main.go

real 0m0.394s
user 0m0.015s
sys 0m0.000s

5. 总结

EqualFold地道

外部链接

[1] mockaroo https://www.mockaroo.com/