gpt4 book ai didi

遍历集合时 Golang 变慢

转载 作者:数据小太阳 更新时间:2023-10-29 03:33:19 30 4
gpt4 key购买 nike

我从 Redis 向我的应用程序提供一个 json,然后我对其进行解码和循环。

这是我从 Redis 提供的 json 的样子:

[
{
"titel": "test 1",
"event": "some value",
"pair": "some value",
"condition": [
"or",
[
"contains",
"url",
"/"
],[
"notcontains",
"url",
"hello"
]
],
"actions": [
[
"option1",
"12",
"1"
],
[
"option2",
"3",
"1"
]
]
}, {
"titel": "test 2",
"event": "some value",
"pair": "some value",
"condition": [
"or",
[
"contains",
"url",
"/"
]
],
"actions": [
[
"option1",
"12",
"1"
],
[
"option2",
"3",
"1"
]
]
}
]

我存储 json 的结构如下所示:

type Trigger struct {
Event string `json:"event"`
Pair string `json:"pair"`
Actions [][]string `json:"actions"`
Condition Condition `json:"condition"`
}

type Condition []interface{}

func (c *Condition) Typ() string {
return (*c)[0].(string)
}

func (c *Condition) Val() []string {
xs := (*c)[1].([]interface{})
ys := make([]string, len(xs))
for i, x := range xs {
ys[i] = x.(string)
}
return ys
}

func (c *Condition) String() (string, string, string) {
return c.Val()[0], c.Val()[1], c.Val()[2]
}

type Triggers struct {
Collection []Trigger
}

我像这样将它解码到结构中:

var triggers Triggers
err := json.Unmarshal([]byte(triggersJson), &triggers.Collection)
if err != nil {
fmt.Println("Error while unmarshaling triggers json: ", err)
}

这在使用围攻进行测试时非常有效。但是,一旦我想开始循环遍历结构,我就开始看到很长的响应时间和超时。

这是我循环它的方式:

for _,element := range triggers.Collection {
if element.Event == "some value" {
fmt.Println("We got: some value")
}
}

没有循环的性能在 500 个并发连接上为 2 毫秒。通过循环,它的 600ihs ms 在 500 上并发并发了一堆超时

理想情况下,我想更改 json 的结构以不包括:

"or",

但我无法控制 json,所以不幸的是这是不可能的。

任何想法是什么导致了这个以及如何解决它?

编辑

我发现是什么让整个事情变慢了。

像这样编辑我的结构:

type Trigger struct {
Event string `json:"event"`
Pair string `json:"pair"`
Actions [][]string `json:"actions"`
//Condition Condition `json:"condition"`
}

从 600 毫秒缩短到 100 毫秒。但是现在我无法解析 Condition

现在确定如何以不同于我当前的方式解析条件,因为它有两种不同的格式

最佳答案

听起来很奇怪,但尽量避免复制 Collection 元素。像这样:

for i := range triggers.Collection {
if triggers.Collection[i].Event == "some value" {
fmt.Println("We got: some value")
}

关于遍历集合时 Golang 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595024/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com