Skip to content

Files

Latest commit

8d041bb · Oct 24, 2021

History

History
139 lines (79 loc) · 11.3 KB

File metadata and controls

139 lines (79 loc) · 11.3 KB

零、前言

Go 高性能实践是一个完整的资源,具有经验证的方法和技术,可帮助您诊断和修复 Go 应用程序中的性能问题。本书首先介绍了性能的概念,在这里您将了解 Go 性能背后的意识形态。接下来,您将学习如何有效地实现 Go 数据结构和算法,并探索数据操作和组织,以便为可伸缩软件编写程序。为分布式系统编写高性能代码所需的并行和并发通道和 goroutines 也是本书的核心部分。接下来,您将学习如何有效地管理内存。您将探索计算统一设备架构CUDA)驱动程序应用程序编程接口API),使用容器构建 Go 代码,并使用 Go 构建缓存加快编译速度。您还可以清楚地了解分析和跟踪 Go 代码以检测系统中的瓶颈。在本书的最后,您将评估集群和作业队列的性能优化,并监控应用程序的性能回归。

这本书是给谁的

这本 Go 书是对 Go 编程有中级到高级理解并对提高代码执行速度感兴趣的开发人员和专业人员的必备书。

这本书涵盖的内容

第一章介绍 Go中的性能,将讨论为什么计算机科学中的性能很重要。您还将了解为什么性能在 Go 语言中很重要。

第 2 章数据结构和算法涉及数据结构和算法,它们是构建软件的基本单元,尤其是复杂性能软件。理解它们将帮助您思考如何最大限度地组织和操作数据,以便编写高效、高性能的软件。此外,迭代器和生成器也是 Go 所必需的。本章将解释不同的数据结构和算法,以及它们的大 O 符号是如何受到影响的。

第 3 章理解并发将讨论利用通道和 goroutines 实现并行和并发,这在 Go 中是惯用的,也是在系统中编写高性能代码的最佳方式。能够理解何时何地使用这些设计模式对于编写 PerformantGo 至关重要。

第 4 章 ALE T1,To T2 算法中的 STL 算法等价物,讨论了来自其他高性能语言,即 C++的程序员有多少理解标准模板库的概念,它在通用库中提供通用编程数据结构和函数,以便快速迭代和大规模编写性能代码。

第 5 章Go中的矩阵和向量计算,一般涉及矩阵和向量计算。矩阵在图形处理和人工智能(即图像识别)中非常重要。向量可以容纳动态数组中的无数对象。它们使用连续存储,可以进行操作以适应增长。 

第 6 章编写可读的 Go 代码,重点关注编写可读的 Go 代码的重要性。理解本章讨论的模式和习惯用法将有助于您编写更易于阅读和在团队之间操作的 Go 代码。此外,能够编写惯用的 Go 将有助于提高代码质量,并帮助项目保持速度。

第 7 章Go 中的模板编程重点介绍 Go 中的模板编程。元编程允许最终用户编写生成、操作和运行 Go 程序的 Go 程序。Go 具有清晰的静态依赖关系,这有助于元编程。它有其他语言在元编程中没有的缺点,比如 Python 中的__getattr__,但如果认为谨慎的话,我们仍然可以生成 Go 代码并编译生成的代码。

第 8 章Go中的内存管理,讨论了内存管理对系统性能的重要性。能够最大限度地利用计算机的内存占用,可以让您在内存中保留功能强大的程序,这样您就不必经常承受磁盘交换带来的巨大性能损失。能够有效地管理内存是编写高性能 Go 代码的核心原则。

第 9 章Go中的 GPU 并行化,重点关注 GPU 加速编程,这在当今的高性能计算堆栈中变得越来越重要。我们可以使用 CUDA 驱动程序 API 进行 GPU 加速。这通常用于深度学习算法等主题。

第 10 章Go中的编译时评估,讨论了在编写 Go 程序时最小化依赖项以及每个文件声明自己的依赖项。常规语法和模块支持也有助于提高编译时间和界面满意度。除了使用容器构建 Go 代码和利用 Go 构建缓存之外,这些东西还有助于加快 Go 编译。

第 11 章构建和部署 Go 代码,重点介绍如何部署新的 Go 代码。为了进一步阐述,本章解释了我们如何将其推广到一个或多个地方,以便针对不同的环境进行测试。这样做将使我们能够提高系统的吞吐量。

第 12 章评测 Go 代码重点关注评测 Go 代码,这是确定 Go 函数中瓶颈所在的最佳方法之一。执行此评测将帮助您推断出可以在函数中进行哪些改进,以及单个片段在函数调用中相对于整个系统所花费的时间。

第 13 章跟踪 Go 代码介绍了一种检查 Go 程序中功能和服务之间互操作性的奇妙方法,也称为跟踪。跟踪允许您通过您的系统传递上下文,并评估您被困的位置。无论是第三方 API 调用、慢速消息队列还是*O(n2*函数,跟踪都将帮助您找到瓶颈所在的位置。

第 14 章集群和作业队列重点介绍了集群和作业队列在 Go 中的重要性,它们是让分布式系统同步工作并传递一致消息的好方法。分布式计算很困难,在集群和作业队列中观察潜在的性能优化变得非常重要。

第 15 章比较了不同版本的代码质量,讨论了在编写、调试、分析和监控长期监控应用程序性能退化的 Go 代码之后应该做什么。如果您不能继续提供基础架构中其他系统所依赖的性能级别,那么向代码中添加新功能是徒劳的。

充分利用这本书

这本书是为那些希望更快地执行代码的 Go 专业人士和开发人员准备的,因此,对 Go 编程的中级到高级理解是充分利用本书的必要条件。Go 语言具有相对最低的系统要求。具有现代操作系统的现代计算机应支持 Go 运行时及其依赖项。Go 用于许多 CPU、内存有限的低功耗设备,和 I/O 要求

您可以在以下 URL 中看到对语言的要求:https://github.com/golang/go/wiki/MinimumRequirements

在本书中,我使用 Fedora Core Linux(在编写本书期间为 29 版)作为操作系统。有关如何安装 Fedora Workstation Linux 发行版的说明可在 Fedora 页面的以下 URL 中找到:https://getfedora.org/en/workstation/download/

Docker 用于本书中的许多示例。您可以在以下 URL 中看到 Docker 的要求:https://docs.docker.com/install/

第 9 章Go中的 GPU 并行化中,我们讨论了 GPU 编程。要执行本章的任务,您需要两件事情中的一件:

  • 支持 NVIDIA 的 GPU。我在测试中使用了 NVIDIA GeForce GTX 670,计算能力为 3.0。
  • 一个支持 GPU 的云实例。第 9 章讨论了几种不同的提供商和方法。GPU 在计算引擎上为此而工作。有关 Compute Engine 上 GPU 的更多最新信息,请访问以下 URL:https://cloud.google.com/compute/docs/gpus

在你读了这本书之后;我希望您能够编写更高效的 Go 代码,也希望您能够量化和验证您的工作。

下载示例代码文件

您可以从您的账户www.packt.com下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packtpub.com/support并注册,将文件通过电子邮件直接发送给您。

您可以通过以下步骤下载代码文件:

  1. 登录或注册www.packt.com
  2. 选择“支持”选项卡。
  3. 点击代码下载。
  4. 在搜索框中输入图书名称,然后按照屏幕上的说明进行操作。

下载文件后,请确保使用以下最新版本解压或解压缩文件夹:

  • WinRAR/7-Zip for Windows
  • 适用于 Mac 的 Zipeg/iZip/UnRarX
  • 适用于 Linux 的 7-Zip/PeaZip

该书的代码包也托管在 GitHub 上的https://github.com/bobstrecansky/HighPerformanceWithGo/ 。如果代码有更新,它将在现有 GitHub 存储库中更新。

我们的丰富书籍和视频目录中还有其他代码包,请访问**https://github.com/PacktPublishing/** 。看看他们!

行动中的代码

本书的行动代码视频可在查看 http://bit.ly/2QcfEJI

下载彩色图像

我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。您可以在这里下载:https://static.packt-cdn.com/downloads/9781789805789_ColorImages.pdf

使用的惯例

本书中使用了许多文本约定。

CodeInText:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。下面是一个示例:“以下代码块将显示Next()咒语”

代码块设置如下:

// Note the trailing () for this anonymous function invocation
func() {
  fmt.Println("Hello Go")
}()

当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:

// Note the trailing () for this anonymous function invocation
func() {
  fmt.Println("Hello Go")
}()

任何命令行输入或输出的编写方式如下:

$ go test -bench=. -benchtime 2s -count 2 -benchmem -cpu 4

粗体:表示一个新术语、一个重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词出现在文本中,如下所示。下面是一个示例:反向算法获取数据集并反转集合的值

警告或重要提示如下所示。

提示和技巧如下所示。

联系

我们欢迎读者的反馈。

一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中注明书名,并发送电子邮件至customercare@packtpub.com

勘误表:尽管我们已尽一切努力确保内容的准确性,但还是会出现错误。如果您在本书中发现错误,如果您能向我们报告,我们将不胜感激。请访问www.packtpub.com/support/errata,选择您的书籍,单击 errata 提交表单链接,然后输入详细信息。

盗版:如果您在互联网上发现我们作品的任何形式的非法复制品,请您提供我们的位置地址或网站名称,我们将不胜感激。请通过copyright@packt.com与我们联系,并提供该材料的链接。

如果您有兴趣成为一名作家:如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请访问authors.packtpub.com

评论

请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在读者可以看到并使用您的无偏见意见做出购买决定,我们 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们书籍的反馈。非常感谢。

有关 Packt 的更多信息,请访问Packt.com