簡體   English   中英

如何在Go中使用清晰的結構值優化性能?

[英]How to optimize performance with clear struct value in Go?

我的API服務器接受發布請求,並且請求主體為JSON,因此我創建了兩個結構對象以接受JSON字符串並將其持久化到數據庫中。但是每次接受請求時,我都需要一次又一次創建struct對象,我嘗試清除而不是重新創建它。演示代碼如下所示:

//The two struct
type Card struct {
  Number string
  Type   string
}

type Person struct {
  Name string
  Cards []Card
}

var p Person

//parse JSON to the struct object
func init() {
  str := `{"name":"aaa","cards":[{"number":"1","type":"visa"},{"number":"2","type":"mastercard"}]}`
  json.Unmarshal([]byte(str), &p)
}

func PersistToDatabase() {
  var err error
  tx, err := db.Begin()
  if err != nil {
    return
  }

  defer func() {
    if err != nil && tx != nil {
      if err := tx.Rollback(); err != nil {
        return
      }
    }
  }

  finish := make(chan bool)

  stmt1, err := tx.Prepare(`insert into tb1(name) values(?)`)
  if err != nil {
    panic(err.Error())
  }
  defer stmt1.Close()

  stmt2, err := tx.Prepare(`insert into tb2(name, num, type) values(?, ?, ?)`)
  if err != nil {
    panic(err.Error())
  }
  defer stmt2.Close()

  go func() {
    defer func() { finish <- true }()
    if _, err = stmt1.Exec(p.name); err != nil {
      log.Println("stmt1.Exec: ", err.Error())
      return
    }

    for _, x := range p.Cards {
      if _, err = stmt2.Exec(p.name, x.Number, x.Type); err != nil {
        log.Println("stmt2.Exec: ", err.Error())
          return
      }
    }
  }
  <-finish
  //clear struct object
  p.Name = ""
  p.Cards = nil //have anything do this better?
}

在代碼底部,我清除了Name元素,但讓Cards元素設置為nil ,我該怎么做呢? 我的數據庫操作有什么問題嗎?

結構不是對象[1]。 雖然從根本上說它們都以某種方式混雜了有序數據,但結構實際上只是變量列表。 沒有調用構造函數。 沒有分配超出其成員元素的內存,也沒有在任何特殊位置分配內存。 (當然,即使在大多數面向對象的語言中,這也許也不算太貴,優化器有時還是很酷的)

type A struct {
    I int
    S string
}

var MyA A

確實與

var (
    I int
    S string
)

編寫類型為MyA = A{}的零結構實際上等效於執行MyA.I = 0; MyA.S = "" MyA.I = 0; MyA.S = "" ,它實際上等效於I = 0; S = "" I = 0; S = "" 執行以上任何一項操作,都不會造成(大量)性能開銷。

這並不意味着結構沒有用。 從概念上講,它們在定義方法,填充數據(例如JSON等情況)方面特別有用。 但是它們沒有什么顯着不同。 最后,這是最重要的事情, 您是否在此代碼塊中概述了顯着的性能瓶頸 如果沒有(我懷疑不是),請不要擔心,這可能很好。 :)

[1] Java或C#樣式的對象,從理論上講(即使不是在實踐中)也更昂貴。 不是不同的C ++對象(更像Go結構)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM