正则匹配与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