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来得到,也可以使用以下程序来生成:
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地道