大小写敏感的比较
在对字符串进行大小写敏感的比较时,最基本的字符串比较操作符比使用 strings 包进行比较要快。
大小写不敏感的比较
对于大小写不敏感的比较,EqualFold(Strings 包)比较快。
使用 EqualFold 时先进行字符数量对比,速度会更快。
比较速度
strings.Compare < 运算符 “==” < strings.EqualFold
原因:
- 都解析了整个字符串。
- strings.Compare源码使用的也是运算符比较
- Equalfold 也会逐个字符进行解析,但是当它解析到两个字符串中不同的字符时,就会提前结束。
测试方法
compare.go
func compareOperators(a string, b string) bool {
if a == b {
return true
} else {
return false
}
}
// strings compare
func compareString(a string, b string) bool {
if strings.Compare(a, b) == 0 {
return true
}
return false
}
compare_test.go
import (
"testing"
)
func BenchmarkCompareOperators(b *testing.B) {
for n := 0; n < b.N; n++ {
compareOperators("This is a string", "This is a strinG")
}
}
func BenchmarkCompareString(b *testing.B) {
for n := 0; n < b.N; n++ {
compareString("This is a string", "This is a strinG")
}
}
20 万行的列表文件==>这个文件包含大量的字符串
compareTxt.go
// operator compare
func compareOperatorsTxt(a string) bool {
file, err := os.Open("names.txt")
result := false;
if err != nil {
log.Fatalf("failed opening file: %s", err)
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if strings.ToLower(a) == strings.ToLower(scanner.Text()) {
result = true
}else {
result = false
}
}
file.Close()
return result
}
// strings compare
func compareStringTxt(a string) bool {
file, err := os.Open("names.txt")
result := false;
if err != nil {
log.Fatalf("failed opening file: %s", err)
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if strings.Compare(strings.ToLower(a), strings.ToLower(scanner.Text())) == 0 {
result = true
}else {
result = false
}
}
file.Close()
return result
}
// EqualFold compare
func compareEFTxt(a string) bool {
file, err := os.Open("names.txt")
result := false;
if err != nil {
log.Fatalf("failed opening file: %s", err)
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if strings.EqualFold(a, scanner.Text()) {
result = true
}else {
result = false
}
}
file.Close()
return result
}
//字符串长度相同而字符不同
func compareByCountTxt(a string) bool {
file, err := os.Open("names.txt")
result := false;
if err != nil {
log.Fatalf("failed opening file: %s", err)
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if len(a) == len(scanner.Text()) && strings.EqualFold(a, scanner.Text()){
result = true
}else {
result = false
}
}
file.Close()
return result
}
compareTxt_test.go
func BenchmarkCompareOperatorsTxt(b *testing.B) {
for n := 0; n < b.N; n++ {
compareOperatorsTxt("Immanuel1234")
}
}
func BenchmarkCompareStringTxt(b *testing.B) {
for n := 0; n < b.N; n++ {
compareStringTxt("Immanuel1234")
}
}
func BenchmarkEqualFoldTxt(b *testing.B) {
for n := 0; n < b.N; n++ {
compareEFTxt("Immanuel1234")
}
}
func BenchmarkCompareByCountTxt(b *testing.B){
for n := 0; n < b.N; n++ {
compareByCountTxt("Immanuel1234")
}
}