gpt4 book ai didi

performance - 如何在 Go 中通过清晰的结构值优化性能?

转载 作者:IT王子 更新时间:2023-10-29 02:28:06 25 4
gpt4 key购买 nike

我的 API 服务器接受 post 请求并且请求正文是 JSON,所以我创建了两个结构对象来接受 JSON 字符串并将其保存到数据库中。但是每次我接受请求时我都需要一遍又一遍地创建结构对象,我尝试清除结构而不是重新创建它。演示代码如下所示:

//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]。虽然从根本上说,它们在某种程度上都是有序数据的混合体,但结构实际上只是一个变量列表。没有构造函数被调用。没有分配超出其成员元素的内存,也没有分配在任何特殊位置。 (即使在大多数 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 结构)。

关于performance - 如何在 Go 中通过清晰的结构值优化性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187450/

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