剖析使Go语言高效的5个特性(1/5): 变量的处理和存储

翻译原文连接 转帖/转载请注明出处程序员

英文原文连接 发表于2014/06/07编程

我最近受邀在Gocon会议上作了一个演讲。Gocon是一个很是棒的,每半年一次在日本东京举行的Go会议。Gocon 2014是彻底由社区举办的一成天活动。它包括了培训以及一个下午的演讲。演讲的主题主要围绕在Go语言在线上环境中的应用。数组

如下是个人演讲稿。原始的演讲稿强调慢而清楚的演讲,因此我作了略微的修改使得它更具可读性。缓存

这里我要感谢Bill Kennedy,Minux Ma,特别是Josh Bleecher Snyder。Josh为准备此次演讲给予了不少的帮助。数据结构


下午好,个人名字叫David。我很高兴今天可以参加Gocon会议。我两年前就打算要参加这个会议,很是感谢会议组织者给我这个演讲的机会。我想让个人演讲以一个问题开始。并发

图片描述

为何你们选择使用Go语言?post

若是你们正打算学习Go语言,或者在产品里使用Go语言,他们对这个问题会有各类各样的答案。但有3个答案被说起的次数最多。这三个答案是:性能

图片描述

首先是并发:Go语言对并行编程有很好的支持。这对许多使用单线程脚本语言(例如Nodejs,Ruby或者是Python)的程序员来讲是很是有吸引力的。对C++或者Java的程序员来讲,由于这些语言里线程的使用开销比较大,也是有吸引力的。学习

便捷的部署:Go编译出来的程序能够被很简单地部署出去。这一点咱们已经从不少Go语言的使用者这里获得承认。spa

最后就是性能。我相信人们使用Go语言最重要的缘由就是由于它很快。

图片描述

我今天就来讨论下对Go语言性能有所帮助的5个特性。我还将和大家分享Go语言实现这些特性的细节。

变量的处理和存储

我要讨论的第一个特性就是Go语言是如何高效的处理和存储变量的。这里有一个Go语言变量的例子。编译之后,变量gocon占了正好4个字节的内存。

图片描述

咱们来和其余语言作个比较

图片描述

因为Python在变量表示上的额外损耗,它存储一样的值须要6倍的内存。这些额外的开销被Python用来记录类型信息,引用计数(reference counting)等等。

咱们再来看另一个例子:

图片描述

和Go语言类似,Java的int类型也使用4个字节的存储空间。可是要在如List或者Map这样的集合里存储int的话,编译器必须把它转换成Integer对象。

图片描述

因此Java里的整数类型更多时候如上图所示。它须要占用16到24个字节的内存。

为何刚才所说的很重要?如今的计算机内存很便宜并且容量也很大,为何这点额外的开销值得关注呢?

下面这张图显示了CPU主频和内存带宽速度的比较。你能够注意到CPU主频速度和内存带宽的速度之间的差距正在一直变大。

图片描述

上图两条曲线之间的差距正是CPU花费了多少时间在等待内存数据。从60年代后期开始,CPU的设计师们已经认识到了这个问题。他们的解决方法是在CPU和主内存之间添加了缓存。缓存本质上就是一块面积更小,可是更快的内存。

图片描述

下面图中定义的是一个Location类型,用来存储某个三维空间里物体的坐标。它是用Go语言写的,因此每一个这样的Location结构正好占用24个字节的存储空间。

图片描述

咱们能够用这个类型来构建一个包含1000个location的数组,它正好占用24000字节的内存。在这个数组里,这些Location结构是在内存中连续分布的,而不是1000个指向随机存储的Location结构的指针。这很是重要,由于全部这1000个Location结构在缓存里是连续存储的,而且他们占用的空间很是紧凑。

图片描述

Go语言让你定义很是紧凑的数据结构,避免了无谓的指针跳转。紧凑的数据结构可以使缓存更加有效。高效的缓存最终给咱们带来了更高的效率。

相关文章
相关标签/搜索