一. Go 为什么快?(译: 五件事让Go变得如此之快)

原文地址: five things that make go fast.

本文并非完整翻译,只对原文关键部分进行提取归纳。

正文:

当人们谈论到为什么做出学习Go的决定时,往往会有不同的回答,但总有三个原因是他们都会谈及的:

  1. 并发性(Concurrency)
  2. 易于部署(Ease to deployment)
  3. 性能(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的性能,那为什么内存开销是比较重要的一个指标呢?
一. Go 为什么快?(译: 五件事让Go变得如此之快)_第1张图片
上面的图描述了CPU计算速度和内存读取速度的发展趋势,可见两条线的间隔越来越多大,这间隔其实也就意味着CPU在等待内存上所花的时间。那么如果内存开销小,那CPU需要等待的时间也就会短些。

type Location struct {
  X, Y, Z float64
}

var los []Location

再来看上面这个例子,Location结构体的一个实例将占用24 bytes内存,那么los切片中的底层数组将占用len(los)*24 bytes,此外底层数组的每个item并不是通过指针指到内存中随机分散的地方,相反,底层数组的每个item存储的是值,而且是紧密有序的。

总结

  1. go创建的变量在内存占用上紧凑干净,避免过多的辅助数据
  2. 紧凑的内存结构能更好的利用高速缓存,减少CPU等待主存的时间

你可能感兴趣的:(Go)