go1.2 map的GC性能提升

沈锋 · · 3303 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

几天前,线上Golang程序 GC调优一例 介绍了为特定程序优化gc的一个例子,从里面可以看出,go在做map的gc时,性能不太理想(50万的map,在i7-2600s上停顿8ms)

今天时星期天,天气不错!下午出去跑步,上午在家玩一会儿程序。从code.google.com下载了go1.2rc5的包,实际测试这个情况有没有改变。

和上次一样的程序,同一台机器:

gc32(1): 2+0+0 ms, 61 -> 30 MB 15457 -> 3198 (357463-354265) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields
gc33(1): 2+0+0 ms, 61 -> 30 MB 15470 -> 3198 (369735-366537) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields
gc34(1): 2+0+0 ms, 61 -> 30 MB 15183 -> 3192 (381720-378528) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields

gc时间由原来的8ms,减少到2ms。

GOGCTRACE 参数废弃,替换为GODEBUG

搜索代码树,找不到GOGCTRACE字样了,现在由GODEBUG环境变量接管。具体代码在src/pkg/runtime/runtime.c?name=go1.2rc5#386:

static struct {
        int8*   name;
        int32*  value;
} dbgvar[] = {
        {"gctrace", &runtime·debug.gctrace},
        {"schedtrace", &runtime·debug.schedtrace},
        {"scheddetail", &runtime·debug.scheddetail},
};
GOGCTRACE=1 go run gc.go  # go1.2以前,GOGCTRACE环境变量控制 详细信息打印
GODEBUG='gctrace=1' go run gc.go  # go1.2rc5 由GODEBUG控制

commit 追溯

好奇提升的原因,追了一会儿代码。

go的gc的代码集中在src/pkg/runtime/mgc0.c里。

# github 上,对golang code的镜像。相比于官方用hg管理,git对于我更友好一点
git clone git@github.com:jnwhiteh/golang.git  
git log src/pkg/runtime/mgc0.c   # 查看 src/pkg/runtime/mgc0.c 的修改记录

这次map gc性能的提升,可能是Keith Randall的这个commitIssue 6119的修复造成的,commit message:

runtime: record type information for hashtable internal structures. Remove all hashtable-specific GC code

大量内存数据,造成GC时的长时间停顿,使我头疼。这也是我日常需要面对的:加载大量数据,在有限的时间内(几十ms),进行在线算法计算,返回结果,比如推荐,搜索等。这使我不得不用C++来完成的程序的编写。欣喜的看到这次进步。map应用非常频繁的数据,这次提升,非常有意义。期待go语言gc的继续进步!


有疑问加站长微信联系(非本文作者)

本文来自:A programmer's site

感谢作者:沈锋

查看原文:go1.2 map的GC性能提升

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3303 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传