gpt4 book ai didi

go - panic ()与结构与指针的含义?

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:29 25 4
gpt4 key购买 nike

使用大型结构调用 panic(x) 与使用指向该结构的指针调用 panic(&x) 有什么含义(如果有的话)?

您传递给 panic 的 interface{} 是否在每次堆栈展开一个级别时都被复制,或者是否有其他魔法在发生?

编辑:这可能很重要的一个例子是在 http.Serve 中,它将从任何 panic 中恢复并提供合适的消息。如果我对一个非常大的结构感到 panic ,这可能会对性能产生一些影响,因为堆栈框架展开并导致我的网络服务器过度负载。

最佳答案

这取决于 panic 的执行次数、值或指针参数、struct 的大小等。在 Go 中,参数是按值传递的。接口(interface)值被表示为一个双字对,给出了一个指向有关存储在接口(interface)中的类型的信息的指针和一个指向相关数据副本的指针。

使用 Go 测试包基准工具。例如,

package main

import "testing"

var sink int

func panic(interface{}) {}

func BenchmarkPanicVal1K(b *testing.B) {
var large struct{ big [1024]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
panic(large)
}
}

func BenchmarkPanicPtr1K(b *testing.B) {
var large struct{ big [1024]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
panic(&large)
}
}

func BenchmarkPanicVal4K(b *testing.B) {
var large struct{ big [4096]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
panic(large)
}
}

func BenchmarkPanicPtr4K(b *testing.B) {
var large struct{ big [4096]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
panic(&large)
}
}

func BenchmarkIfaceVal1K(b *testing.B) {
var iface interface{}
var large struct{ big [1024]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
iface = large
}
_ = iface
}

func BenchmarkIfacePtr1K(b *testing.B) {
var iface interface{}
var large struct{ big [1024]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
iface = &large
}
_ = iface
}
func BenchmarkIfaceVal4K(b *testing.B) {
var iface interface{}
var large struct{ big [4096]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
iface = large
}
_ = iface
}

func BenchmarkIfacePtr4K(b *testing.B) {
var iface interface{}
var large struct{ big [4096]byte }
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
iface = &large
}
_ = iface
}

输出:

$ gotest panic_test.go -bench=.

BenchmarkPanicVal1K-4 20000000 70.3 ns/op 0 B/op 0 allocs/op
BenchmarkPanicPtr1K-4 2000000000 0.36 ns/op 0 B/op 0 allocs/op
BenchmarkPanicVal4K-4 1000000 1483 ns/op 4096 B/op 1 allocs/op
BenchmarkPanicPtr4K-4 2000000000 0.36 ns/op 0 B/op 0 allocs/op


BenchmarkIfaceVal1K-4 5000000 378 ns/op 1024 B/op 1 allocs/op
BenchmarkIfacePtr1K-4 2000000000 0.36 ns/op 0 B/op 0 allocs/op
BenchmarkIfaceVal4K-4 1000000 1469 ns/op 4096 B/op 1 allocs/op
BenchmarkIfacePtr4K-4 2000000000 0.36 ns/op 0 B/op 0 allocs/op

引用资料:

Go Data Structures: Interfaces

关于go - panic ()与结构与指针的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191154/

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