前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转--Golang语言 内存分配器性能测试

转--Golang语言 内存分配器性能测试

作者头像
李海彬
发布2018-03-20 16:52:49
1K0
发布2018-03-20 16:52:49
举报
文章被收录于专栏:Golang语言社区Golang语言社区

在C/C++里,自己动手实现内存分配器是很常见的事情,写过几年C/C++程序的人可能都做过这样的事情。这其中很重要的一个原因是C/C++不支持垃圾回收。但是既然go语言已经支持垃圾回收,还有必要自己去写一个内存分配器吗?我们做一个简单的测试看看结果怎么样。

测试平台:

OS: ubuntu 12.04 x86_64

CPU: i5 2.27G

MEMORY: 8G

// ben1.go 自己实现内存分配器

package main

type Pool struct {

buf []byte

}

func (p *Pool) alloc(size int) []byte {

if len(p.buf) < size {

l := 1024 * 1024 for l < size {

l += l if l <= 0 {

panic("out of memory")

} }

p.buf = make([]byte, l)

} buff := p.buf[:size] p.buf = p.buf[size:] return buff

}

func main() {

var p Pool for i := 0; i < 10000000; i++ {

_ = p.alloc(100)

}

}

// ben2.go 系统内存分配器

package main

func main() {

for i := 0; i < 10000000; i++ {

_ = make([]byte, 100)

}

}

编译测试:

go build ben1.go

time ./ben1

go build ben2.go

time ./ben2

测试结果:

次数

ben1(s)

ben2(s)

1

0.308

2.057

2

0.304

2.048

3

0.308

2.093

平均

0.307

2.066

结论:

可以看到,自己实现的内存分配器的执行时间大约是系统内存分配器的十分之一,差不多是一个数量级的差距。因此对于一些特定应用场景,比如网络库等,使用自定义内存分配器还是很有必要的。由于go语言提供了垃圾收集功能,所以实现自定义内存分配器相比较在C/C++里简单很多。但是对于自定义内存分配器,还需要注意多goroutine下的同步问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档