【发布时间】:2019-01-14 09:19:38
【问题描述】:
我创建了一个函数来将特定的字符串(派生自 [] 字节)转换为结构。在我正在构建的程序中执行加密和解密,并且在这两个通道之间,数据通过 JSON 传输。我建议的功能有效,但是当字符串变得很长时,处理时间很长。 我想问的是是否有人知道如何加快此功能或如何更好地管理这种情况。
这是函数
func Datadecrypt(input []byte) Data {
s := string(input)
vals := strings.Replace(s," "," ",-1)
part := strings.Fields(vals)
c := strings.Split(s, "int=")[1]
co := strings.Split(c, ")")[0]
count, err := strconv.Atoi(co)
if err != nil {
log.Fatal(err)
}
var stringa string
for j := 0; j<len(part); j++ {
if strings.ContainsAny(part[j], ":") {
stringa = stringa+" "+part[j]
} else {
stringa = stringa+","+part[j]
}
}
var interpart []map[string]string
var result Data
var i = 0
for {
split := strings.Split(stringa, "[")[2+i]
splitend := strings.Split(split, "]")[0]
control := strings.Replace(splitend," "," ",-1)
mapst := mapstring.StrToMS(control)
interpart = append(interpart, mapst)
i++
if i >= count {
break
}
}
result = Data{Count: count, Results: interpart}
return result
}
这是结构
type Data struct {
Count int `json:"count"`
Results []map[string]string `json:"result"`
}
这是从 s 派生的字符串:= string (input)
"Count=\"%!s(int=107)\"\nResults=\"[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]\"\n"
我上面写的字符串是使用 JSON 响应打印出来的
这是输入字符串,不是 JSON
Count="%!s(int=107)"
Results="[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]"
这是我通过函数得到的结果
{107 map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]}
谢谢,提前
【问题讨论】:
-
不要转成字符串,保留字节切片,所有功能都可用golang.org/pkg/bytes
-
您正在做的是将字节转换为字符串,然后处理字符串以获取值是完全没有必要的。
-
写一个基准测试并使用 pprof 找出慢的地方。
-
字符串来自http请求,但响应是加密的。它由 ioutil.ReadAll 读取,然后使用我创建的解密函数解密,所有结果是 Datadecrypt() 中输入的 []byte。
-
正如@Volker 所指出的,您必须进行测量以找出慢的地方,尝试优化,并测量是否更快。这就是优化代码的方法。请记住,尽管大密文的加密/解密无论如何都需要时间(这在某种程度上是加密的重点),所以它的运行速度会有一定的限制。
标签: string performance function go