原文地址: five things that make go fast.
本文并非完整翻译,只对原文关键部分进行提取归纳。
正文:
当人们谈论到为什么做出学习Go的决定时,往往会有不同的回答,但总有三个原因是他们都会谈及的:
- 并发性(Concurrency)
- 易于部署(Ease to deployment)
- 性能(Performance)
人们选择Go的一个重要原因是因为它快。Go的众多特性中,有五点对其性能有着重要的影响。
一. 处理和存储值的方式
var gocon int32 = 2020
以上是go中存储数值的一个例子,这个例子中gocon
会占用4 bytes的内存,正如其数据类型int32
描述的一样,不存在隐藏的内存占用。
可以与Python进行比较,保存相同的数值在Python中需要花费近6倍的内存,这些额外占用的内存被用来追踪类型信息,引用计数等。
再来看下Java
int gocon=2020;
与go一样,java中也会占用4 bytes的内存,似乎也是很紧凑的存储方式了,然而,如果要把多个int
数值放到集合中,比如List
中,就不得不用包装类型Integer
,而一个Integer
对象一般会占用16~24 bytes。
我们这里是在探究go的性能,那为什么内存开销是比较重要的一个指标呢?
上面的图描述了CPU计算速度和内存读取速度的发展趋势,可见两条线的间隔越来越多大,这间隔其实也就意味着CPU在等待内存上所花的时间。那么如果内存开销小,那CPU需要等待的时间也就会短些。
type Location struct {
X, Y, Z float64
}
var los []Location
再来看上面这个例子,Location结构体的一个实例将占用24 bytes内存,那么los切片中的底层数组将占用len(los)*24
bytes,此外底层数组的每个item并不是通过指针指到内存中随机分散的地方,相反,底层数组的每个item存储的是值,而且是紧密有序的。
总结
- go创建的变量在内存占用上紧凑干净,避免过多的辅助数据
- 紧凑的内存结构能更好的利用高速缓存,减少CPU等待主存的时间