Golang高效编写(整理)

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

这是一篇如何编写高效Golang语言程序的文章。这是从一些开发者的经验总结中整理出来的。根据这篇文章,你可以编写出一篇更高效的Golang程序。

尽量使用直接的类型

interface{}提供了golang中的interface类似于java的interface、PHP的interface或C++的纯虚基类。通过这种方式可以提供更快捷的编码。但是这种方式也带来了一些问题,最大的问题还是性能问题。

// method 1
a.AA()
// method 2
v.(InterfaceA).AA()
// method 3
switch v.(type) {
case InterfaceA:
    v.(InterfaceA).AA()
}

这三组方法性能逐个下降,最好的方式是直接进行类型引用。

指针传参效率更高

指针传参会减少对象复制过程,效率更高。

func Call(a *Struct) uint64 {
    return a.Ba
}

创建对象时避免创建引用

上面的方法效率要比下面的方法效率更高:

// method 1
new(Struct)
Struct{}
// method 2
&BigStruct{}

range遍历

常见的range方式通常是如下的方式:

for k,v := range slices {
    log.Println(v)
}

或者是省略k,使用v就可以遍历整个slices。但是,实际上下面这个方法会更快,原因是这里面节省了v的拷贝,速度要比拷贝更快:

for k,_ := range slices {
    log.Println(slices[k])
}

更快的运算

除法运算更慢,尝试变成乘法吧。嗯,就是这样。

更快的结构体

map方式的结构体,其他的数据方式,性能方式相差不大。效率上,硬编码 > 指针slice的range循环 > for循环,需要根据具体环境选择,毕竟相差不大。

反射会影响性能

除非必要情况下,减少反射可以提升程序的整体性能。

避免大量重复创建对象

会对GC造成负担,目前Golang的GC会导致程序暂停。连续小内存分配会导致大量的cpu消耗在scanblock这个函数上;连续make([]T, size)来分配slice还会额外导致cpu消耗在 runtime.memclr函数上。


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

本文来自:ipfans's Blog

感谢作者:kevin

查看原文:Golang高效编写(整理)

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

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