1. 首页

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