栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Go中获取变量的内存大小?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Go中获取变量的内存大小?

unsafe.SizeOf()
并且
reflect.Type.Size()
仅返回传递值的大小,而无需递归遍历数据结构和添加指针值的大小。

slice是相对简单的结构:

reflect.SliceHeader
,并且由于我们知道它引用了后备数组,因此我们可以轻松地“手动”计算其大小,例如:

s := make([]int32, 1000)fmt.Println("Size of []int32:", unsafe.Sizeof(s))fmt.Println("Size of [1000]int32:", unsafe.Sizeof([1000]int32{}))fmt.Println("Real size of s:", unsafe.Sizeof(s)+unsafe.Sizeof([1000]int32{}))

输出(在Go Playground上尝试):

Size of []int32: 12Size of [1000]int32: 4000Real size of s: 4012

地图是更复杂的数据结构,我不会详细介绍

计算任何变量或结构的大小(递归)

如果您需要“实数”数字,则可以利用Go的测试工具,该工具还可以执行内存基准测试。传递

-benchmem
参数,并且在基准函数内部仅分配要测量的内存:

func BenchmarkSlice100(b *testing.B) {    for i := 0; i < b.N; i++ { getSlice(100) }}func BenchmarkSlice1000(b *testing.B) {    for i := 0; i < b.N; i++ { getSlice(1000) }}func BenchmarkSlice10000(b *testing.B) {    for i := 0; i < b.N; i++ { getSlice(10000) }}func BenchmarkMap100(b *testing.B) {    for i := 0; i < b.N; i++ { getMap(100) }}func BenchmarkMap1000(b *testing.B) {    for i := 0; i < b.N; i++ { getMap(1000) }}func BenchmarkMap10000(b *testing.B) {    for i := 0; i < b.N; i++ { getMap(10000) }}

(删除的定时和从印刷呼叫

getSlice()
getMap()
当然)。

go test -bench . -benchmem

输出为:

BenchmarkSlice100-4    3000000        471 ns/op        1792 B/op      1 allocs/opBenchmarkSlice1000-4    300000       3944 ns/op       16384 B/op      1 allocs/opBenchmarkSlice10000-4    50000      39293 ns/op      163840 B/op      1 allocs/opBenchmarkMap100-4       200000      11651 ns/op        2843 B/op      9 allocs/opBenchmarkMap1000-4       10000     111040 ns/op       41823 B/op     12 allocs/opBenchmarkMap10000-4       1000    1152011 ns/op      315450 B/op    135 allocs/op

B/op
值告诉您每个操作分配了多少字节。
allocs/op
告诉每个操作发生了多少(不同的)内存分配。

在我的64位体系结构(其中的大小

int
为8个字节)上,它告诉您具有2000个元素的切片的大小大约为16 KB(与2000 * 8字节一致)。包含1000
int-int
对的地图大约需要分配42 KB。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号