【发布时间】:2019-03-14 15:01:25
【问题描述】:
我有两个用 Go 编写的类似程序的示例。该代码的主要目的是使用结构中的值对结构进行排序。
指针示例
package main
import (
"fmt"
"sort"
)
type payload struct {
data string
value float64
}
type container struct {
counter int
storage map[int]*payload
}
type payloadSlice []*payload
// Len is part of sort.Interface.
func (p payloadSlice) Len() int {
return len(p)
}
// Swap is part of sort.Interface.
func (p payloadSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
// Less is part of sort.Interface. We use count as the value to sort by
func (p payloadSlice) Less(i, j int) bool {
return p[i].value < p[j].value
}
func main() {
name := "special_unique_name"
var m = map[string]container{
name: {counter: 10, storage: map[int]*payload{
5: {data: "epsilon", value: 55},8: {data: "theta", value: 85},4: {data: "delta", value: 48},1: {data: "alpha", value: 14},10: {data: "kappa", value: 101},
3: {data: "gamma", value: 31},6: {data: "zeta", value: 63},2: {data: "beta", value: 26},9: {data: "iota", value: 92},7: {data: "eta", value: 79},
}},
}
s := make(payloadSlice, 0, len(m[name].storage))
for _, v := range m[name].storage {
s = append(s, v)
}
sort.Sort(s)
for _, v := range s {
fmt.Println(name, v)
}
}
数值示例
package main
import (
"fmt"
"sort"
)
type payload struct {
data string
value float64
}
type container struct {
counter int
storage map[int]payload
}
type payloadSlice []payload
// Len is part of sort.Interface.
func (p payloadSlice) Len() int {
return len(p)
}
// Swap is part of sort.Interface.
func (p payloadSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
// Less is part of sort.Interface. We use count as the value to sort by
func (p payloadSlice) Less(i, j int) bool {
return p[i].value < p[j].value
}
func main() {
name := "special_unique_name"
var m = map[string]container{
name: {counter: 10, storage: map[int]payload{
5: {data: "epsilon", value: 55},8: {data: "theta", value: 85},4: {data: "delta", value: 48},1: {data: "alpha", value: 14},10: {data: "kappa", value: 101},
3: {data: "gamma", value: 31},6: {data: "zeta", value: 63},2: {data: "beta", value: 26},9: {data: "iota", value: 92},7: {data: "eta", value: 79},
}},
}
s := make(payloadSlice, 0, len(m[name].storage))
for _, v := range m[name].storage {
s = append(s, v)
}
sort.Sort(s)
for _, v := range s {
fmt.Println(name, v)
}
}
我想知道两个时刻:
哪个示例会节省内存? (我猜是指针方式)
如何使用地图内具有不同数量结构的测试数据来衡量这些示例的性能?您能帮我创建 Benchmark 吗?
我想地图中每个结构的大小平均会在 1-2kB 之间变化。
【问题讨论】:
-
如果通过“内存高效”,您的意思是使用更少的内存,使用指针不一定更有效,因为您要添加 64 位(和指针取消引用,但这是一个时间权衡)每个值的顶部。使用您的程序中最合乎逻辑的一个,并在您遇到性能问题时进行配置。 (另外,不管你的有效载荷数据有多大,你的有效载荷结构总是相同的大小)
-
欢迎来到 StackOverflow!尽量将您的问题保留在一个问题上,并在问题正文中而不是在外部链接中包含任何相关代码。随意使用外部链接来提供额外的上下文。
-
JimB,我完全没有性能问题,我对哪种方法更好以及如何正确测试它很感兴趣。我用 golang "testing" 包做了一个简单的基准测试,但是我只能用一个很小的预定义数据集来测试代码,我想知道如何用更大的数据集进行测试。
-
从程序中有意义的那个开始,因为在 99.9% 的情况下,其他情况无关紧要。在 64 位系统上,每个
payload结构体只有 24 个字节,因此添加指针可能同样会减慢速度。如果您想使用更大的数据集进行测试,您只需要一个更大的数据集,这通常伴随着确定现实世界的使用情况,而不是事先猜测。
标签: go testing benchmarking