博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5个GoLang 应用优化措施
阅读量:6008 次
发布时间:2019-06-20

本文共 2119 字,大约阅读时间需要 7 分钟。

hot3.png

这是Go 的开发者之一 Dave Cheney 介绍的5个GoLang 优化措施:

清晰赋值类型

比如确认一个数不会超过 uint32 就不要使用int,下表是数值的范围

uint8       the set of all unsigned  8-bit integers (0 to 255)uint16      the set of all unsigned 16-bit integers (0 to 65535)uint32      the set of all unsigned 32-bit integers (0 to 4294967295)uint64      the set of all unsigned 64-bit integers (0 to 18446744073709551615)int8        the set of all signed  8-bit integers (-128 to 127)int16       the set of all signed 16-bit integers (-32768 to 32767)int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)float32     the set of all IEEE-754 32-bit floating-point numbersfloat64     the set of all IEEE-754 64-bit floating-point numberscomplex64   the set of all complex numbers with float32 real and imaginary partscomplex128  the set of all complex numbers with float64 real and imaginary partsbyte        alias for uint8rune        alias for int32

赋值:

var gocon uint32 = 2015

数值能用小的用小的,尽量让数值留在CPU cache,而不是速度更慢的内存里。

减少函数调用

函数调用都有 overhead(额外开销),比如保存调用栈,CPU切出。

Go 编译器通常会尝试进行内联,将小函数直接复制并编译。

如下面代码:

package mainimport "fmt"func main() {    fmt.Println(DoubleMax(2, 10))}func Max(a, b int) int {    if a > b {        return a    }    return b}func DoubleMax(a, b int) int {    return 2 * Max(a, b)}

加参数m 查看内联状态:

go build -gcflags=-m inline.go

可以看到:

$ go build -gcflags=-m inline.go # command-line-arguments./inline.go:9: can inline Max./inline.go:17: inlining call to Max./inline.go:6: main ... argument does not escape

函数Max 可以内联。内联使可执行的二进制文件更大了,但性能更好。

内联后上例的DoubleMax 函数就是这个样子:

func DoubleMax(a, b int) int {    tmp := b    if a > b {        tmp = a    }    return 2 * tmp}

尽量使用局部变量

下图是进程地址空间示意:

进程地址空间

stack作用域是本地的(locals),在函数执行完之后会自动收回,CPU控制,效率高;而heap则需要由程序来管理,效率低。

应该把不需要传出的参数尽量控制在函数内。

局部变量

上图的变量numbers 只在 Sum中,编译器也会自动分配100个int空间在stack中,而不是heap中。

局部变量

上图变量c是通过new函数生成的,但是因为在center外没有c的引用,所以c也会被存储在stack上。

使用Goroutine 协程

Goroutine是比进程、线程都小的执行单元,Goroutine中的会被调度器(scheduler)切出的操作:

  • chan 收发
  • go 语句调用函数
  • 阻塞的syscall
  • gc

第五个太高级了,不常用。

原文 

转载于:https://my.oschina.net/wdyoschina/blog/710251

你可能感兴趣的文章
nginx面试常问题目
查看>>
制作ubuntu系统u盘镜像,以及安装
查看>>
JAVA多线程深度解析
查看>>
Kafka High Level Consumer 会丢失消息
查看>>
时间轴
查看>>
入坑vim之配置文件vimrc
查看>>
java 获取系统当前时间的方法
查看>>
Ubuntu 10.04升级git 到1.7.2或更高的可行方法
查看>>
Spring Security4实战与原理分析视频课程( 扩展+自定义)
查看>>
消息队列服务器 memcacheq的搭建
查看>>
VMware Horizon View 7.5 虚拟桌面实施咨询与购买--软件硬件解决方案
查看>>
RabbitMQ如何保证队列里的消息99.99%被消费?
查看>>
第一周博客作业
查看>>
thinkpython2
查看>>
String、StringBuffer和StringBuilder的区别
查看>>
linux学习之“VI”与“VIM”
查看>>
linux下无线网卡驱动安装
查看>>
oracle recyclebin与flashback drop
查看>>
我的友情链接
查看>>
svmlight使用说明
查看>>