加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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上)
因此当alloc为65536(正好是64K)时,它运行30秒(!!!!).
当alloc为65535时,需要大约200ms.
有人可以向我解释一下吗?
我在家里用我的核心i7-920 @ 3.8GHZ尝试了相同的代码,但它没有显示相同的结果(两者都花了大约200ms).任何人都知道发生了什么事?

解决方法

设置GOGC =关闭改进的性能(低至100ms).为什么? 当你使用go build -gcflags -m构建时,编译器会打印转义到堆的任何分配.它真的取决于你的机器和GO编译器版本,但是当编译器决定分配应该移动到堆时,它意味着两件事: 1.分配将花费更长时间(因为堆栈上的“分配”只是1 cpu指令) 2. GC将不得不在以后清理该内存 – 耗费更多的CPU时间 对于我的机器,65536字节的分配转义到堆,65535不转义. 这就是为什么1个字节将整个过程从200ms改为30s.惊人..

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读