2016-01-04 84 views
-1

我正在給我的應用程序提供一個來自Redis的json,然後我解組並循環播放。Golang緩慢循環播放時收集

這裏是從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 
} 

和IM解編入像這樣的結構:

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

這個工作和執行完美,同時用圍攻進行測試。然而,只要我想開始循環結構Im,開始看到很長的響應時間和超時。

這是我遍歷如何:

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

性能,而不環路上500個併發連接2ms的。 隨着循環其對500個併發600ihs毫秒一束超時

理想的Id想改變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

現在知道如何解析條件以另一種方式比即時通訊目前做盡職具有兩種不同格式

+0

通常在集合中有4-50個 – mjhd

+0

比較4-50個字符串的循環不會將執行時間從2ms增加到600ms。其他事情正在發生。 –

+0

剖析你的代碼並查看阻塞的內容。您在這裏沒有足夠顯示問題。 – JimB

回答

2

聽起來不可思議,但儘量避免集合元素的複製。例如:

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