golang切片分配性能
发布时间:2020-12-16 09:26:06 所属栏目:大数据 来源:网络整理
导读:在查看GO中的内存分配性能时,我偶然发现了一件有趣的事情. package mainimport ( "fmt" "time" )func main(){ const alloc int = 65536 now := time.Now() loop := 50000 for i := 0; iloop;i++{ sl := make([]byte,alloc) i += len(sl) * 0 } elpased := ti
在查看GO中的内存分配性能时,我偶然发现了一件有趣的事情.
package main import ( "fmt" "time" ) func main(){ const alloc int = 65536 now := time.Now() loop := 50000 for i := 0; i<loop;i++{ sl := make([]byte,alloc) i += len(sl) * 0 } elpased := time.Since(now) fmt.Printf("took %s to allocate %d bytes %d times",elpased,alloc,loop) } 我在Core-i7 2600上运行它,版本为1.6 64bit(在32位上也是相同的结果)和16GB RAM(在WINDOWS 10上) 解决方法
设置GOGC =关闭改进的性能(低至100ms).为什么? 当你使用go build -gcflags -m构建时,编译器会打印转义到堆的任何分配.它真的取决于你的机器和GO编译器版本,但是当编译器决定分配应该移动到堆时,它意味着两件事: 1.分配将花费更长时间(因为堆栈上的“分配”只是1 cpu指令) 2. GC将不得不在以后清理该内存 – 耗费更多的CPU时间 对于我的机器,65536字节的分配转义到堆,65535不转义. 这就是为什么1个字节将整个过程从200ms改为30s.惊人..
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |