正则匹配与for循环的效率对比-字符串匹配更快
写商城的时候,运费模板是有一个包含地区的字段是转为Json字符串保存在字段里的
在调用的时候有两种方案可以选择,一种是直接文字查找是否包含地区,另外还有一种就是for循环数组,判断是否相等
于是写了一段代码用来测试一下两种方式的速度
package main
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
)
func main() {
//这里的base是可以随便改的,就是一个名字
base := "酒埠江"
basenum:="100"
b := []string{}
for i := 1; i < 200; i++ {
str := strconv.Itoa(i)
b = append(b, base+str)
}
mjson, _ := json.Marshal(b)
mString := string(mjson)
fmt.Println(mString)
//以上为初始化数组生成json字符串
t := time.Now()
//这里开始计算字符串查找方式
strings.Index(mString, base+basenum)
elapsed := time.Since(t)
fmt.Println("字符串匹配的时间", elapsed)
t1 := time.Now()
//这里开始计算数组方式,因为数据库调出来是字符串状态,所以需要json转到[]string里面
b1 := []string{}
json.Unmarshal([]byte(mString), &b1)
for i := 1; i < len(b1); i++ {
if b[i] == base+basenum {
fmt.Println("找到了跳过")
break
}
}
elapsed1 := time.Since(t1)
fmt.Println("for循环的时间", elapsed1)
}
//打印结果
//字符串匹配的时间 6.017us
//找到了跳过
//for循环的时间 211.351us为了模拟真实情况,所以for循环需要先把字符串转换成[]string,而如果直接for循环原来的b的话,效率能拉到ns几纳秒级别,但由于实际情况肯定是从数据库调出来json字符串,所以json.unmarshal这个步骤拉慢了一两百微秒
最后得出结论,如果保存的权限是json字符串形式的话,匹配权限或者匹配地名看是否符合要求用字符串查找效率会更高
如果用的是把每个权限或者地名都存一行数据的话,调用数据库应该也挺耗时间的
所以我的选择是,如果保存权限或者运费模板时,把所有权限转一个json字符串,再保存进数据库,一次性查出来后,再用字符串查找去实现功能
本文来自投稿,不代表本人立场,如若转载,请注明出处;如有问题您可以发邮件到:itlun@qq.com