在集合上循环时Golang变慢

gstyhher  于 2022-12-31  发布在  Go
关注(0)|答案(1)|浏览(121)

我从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个并发连接上,没有循环的性能是2ms,而有了循环,在500个并发连接上的性能是600ihs ms,并且有很多超时
理想情况下,我希望更改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
现在确定如何以另一种方式解析条件,而不是我目前所做的,因为它有两种不同的格式

fykwrbwg

fykwrbwg1#

听起来很奇怪,但要尽量避免复制Collection元素。

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

相关问题