Performance 如何在Go中使用清晰的结构值优化性能?

Performance 如何在Go中使用清晰的结构值优化性能?,performance,optimization,struct,transactions,go,Performance,Optimization,Struct,Transactions,Go,我的API服务器接受post请求,请求主体是JSON,因此我创建了两个struct对象来接受JSON字符串并将其保存到数据库中。但每次我接受请求时,我都需要一遍又一遍地创建struct对象,我尝试清除该结构,而不是重新创建它。演示代码如下所示: //The two struct type Card struct { Number string Type string } type Person struct { Name string Cards []Card } var

我的API服务器接受post请求,请求主体是JSON,因此我创建了两个struct对象来接受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?
}
//两个结构
类型卡结构{
数字串
类型字符串
}
类型Person结构{
名称字符串
卡片
}
var p人员
//将JSON解析为struct对象
func init(){
str:=`{“名称”:“aaa”,“卡片”:[{“编号”:“1”,“类型”:“visa”},{“编号”:“2”,“类型”:“万事达卡”}]}`
Unmarshal([]字节(str),&p)
}
func persistodatabase(){
变量错误
tx,err:=db.Begin()
如果错误!=零{
返回
}
延迟函数(){
如果错误!=nil&&tx!=nil{
如果错误:=tx.Rollback();错误!=nil{
返回
}
}
}
完成:=制作(陈波)
stmt1,err:=tx.Prepare(`insert-into-tb1(name)值(?)`)
如果错误!=零{
死机(err.Error())
}
延迟stmt1.Close()
stmt2,err:=tx.Prepare(`insert-into-tb2(名称、数量、类型)值(?,?)`)
如果错误!=零{
死机(err.Error())
}
延迟stmt2.Close()
go func(){

defer func(){finish一个结构不是一个对象[1]。虽然从根本上说,它们都是以某种方式混乱的有序数据,但一个结构实际上只是一个变量列表。没有调用构造函数。没有分配其成员元素之外的内存,也没有分配到任何特殊位置。(就算这在大多数OO语言中也不太昂贵,优化器有时也很酷)如果我有

type A struct {
    I int
    S string
}

var MyA A
这和我的想法并没有本质上的区别

var (
    I int
    S string
)
编写类型为
MyA=a{}
的零结构实际上相当于执行
MyA.I=0;MyA.S=“”
,而这又实际上相当于
I=0;S=“
。执行上述任何操作都不应该有(显著的)性能开销

这并不意味着结构没有用处。从概念上讲,它们在定义方法和填充数据(如JSON)方面非常有用。但它们之间没有明显的区别。最后,也是最重要的一点,在这段代码中是否存在显著的性能瓶颈?如果没有(我想不会的),别担心,可能没问题


(1)java或C++的样式对象,理论上(即使在实践中)更贵。不是C++对象不同(更像GO结构)。

< P>结构不是对象[1 ]。虽然从根本上说,它们都是某种方式的有序数据的混合体,但结构实际上只是一个变量列表。不调用构造函数。不分配其成员元素之外的内存,也不分配在任何特殊位置。(就算这在大多数OO语言中也不太昂贵,优化器有时也很酷)如果我有

type A struct {
    I int
    S string
}

var MyA A
这和我的想法并没有本质上的区别

var (
    I int
    S string
)
编写类型为
MyA=a{}
的零结构实际上相当于执行
MyA.I=0;MyA.S=“”
,而这又实际上相当于
I=0;S=“
。执行上述任何操作都不应该有(显著的)性能开销

这并不意味着结构没有用处。从概念上讲,它们在定义方法和填充数据(如JSON)方面非常有用。但它们之间没有明显的区别。最后,也是最重要的一点,在这段代码中是否存在显著的性能瓶颈?如果没有(我想不会的),别担心,可能没问题


(1)java或C++的样式对象,理论上(即使在实践中)更贵。< /p>是否有任何理由使用全局变量来保存数据?如果这个代码被多个GORUTION并发调用,这将产生一个问题。@ JAMESENSTRIGHY YEY是正确的。而且我认为如果我在“代码> GO 函数中定义变量,理论上代价是内存昂贵吗?这取决于ST有多大。你所说的结构是。我在你的示例代码中没有看到任何看起来特别大的东西。@JamesHenstridge上面的代码只是一个演示,实际数据是一个包含20个元素的结构,其中两个元素是结构类型切片。如果你在函数之间作为指针传递结构,那么在如果你真的遇到了性能问题,你有没有理由使用全局变量来保存数据?如果这个代码被多个GORUTION并发调用,那么会产生一个问题。从理论上讲,内存成本很高?这取决于你所说的结构有多大。我在你的示例代码中没有看到任何看起来特别大的东西。@JamesHenstridge上面的代码只是一个演示,实际数据是一个包含20个元素的结构,其中两个元素是struct type slice,如果你正在传递结构between作为一个指针,那么这种大小的东西应该不会有太多问题。你真的遇到性能问题吗?我想知道当我频繁创建struct变量时,它的成本会很高吗?不想知道:进行度量。不要预优化那些无法证明瓶颈的东西。@Volker我刚才做了,性能很好太棒了,谢谢你的建议我想知道当我经常创建结构变量时,它的成本会很高吗?不想知道:进行测量。不要预先优化无法证明瓶颈的东西。@Volker我刚刚做了,性能非常好,谢谢你的建议