最大限度地提高GO性能的技术介绍

186 阅读5分钟

自从Golang诞生以来,它在程序员中越来越受欢迎。许多开发者和团队正从其他语言如Python、Ruby和Node转移到Golang。

迁移到Golang的原因有很多:

  • 资源优化
  • 并发性
  • 效率高
  • 高速度
  • 可扩展性

开发人员喜欢这种语言的最常见的原因是它所提供的高速度和易扩展性。

随着应用程序的代码长度和复杂性的增加,应用程序的性能会受到影响。这种情况一直在发生,而且是不可避免的。然后,当然,开发人员开始质疑他们所选择的语言或框架,但造成痛苦的总是代码的编写方式。

提高性能的技巧

这里有几点可以帮助你提高Golang应用程序的效率和性能:

  • 使用CPU的多个核心。Goroutines是使Golang中的并发性容易实现的功能。尽管程序员在大多数情况下选择在单个核心上运行例程,但有一种方法可以利用多个核心来运行Goroutines。你可以使用"`GOMAXPROCS"`环境变量来设置Goroutines使用的内核数量。你需要明智地选择这个数字。如果你的Goroutines通信量很大,最好是在一个核心上。否则,使用多个内核也是有好处的。

  • 避免过度使用Goroutines。我目睹了太多的Goroutines被启动的情况;有时,它被嵌套在许多层面。这可能会导致严重的性能下降。建议将Goroutines的使用限制在最佳水平。

  • 优化地图。建议你在应用程序中创建的地图的键中使用整数。如果你的键包含整数,取值总是更快。

  • 在热代码中重新使用变量--给垃圾收集器一个喘息的机会。在代码中被多次调用的部分,如果你分配了新的对象/变量,就需要时间来创建它们。这使得垃圾收集器在你从代码块中出来时做更多的工作。如果你使用已经初始化的对象,垃圾收集器的工作就会减少,这就提高了应用程序的速度。

  • 检查StringBuffer和StringBuilder。在代码中,我们经常使用'+'和'+='这样的运算符来连接字符串。这些运算符对开发者来说很方便,但同时,每次使用这些运算符时,都会在内存中创建一个新的字符串对象。

  • 适当的数组大小。当一个数组中的条目数达到最大尺寸时,数组的尺寸就会增加一倍,数组就会被复制到内存中的一个新的位置,这时就会有垃圾收集器介入。如果阵列的大小分配得当,应用程序的性能就不会受到影响。

找到你应用程序中的痛点

知道如何提高你的应用程序的速度或性能总是好的。然而,要找到代码中导致性能下降的部分并不容易,尤其是当代码库很大的时候。在这种情况下,剖析器就派上用场了。

剖析器对程序进行动态分析,测量许多方面的性能,如CPU利用率和内存分配。剖析器还指出了行为不端的代码片断:消耗了大量的CPU容量或对某个方法进行了过多的调用。

剖析器对于发现你的应用程序中的性能问题非常有用。它们将你从担心性能的任务中解脱出来,这样你就可以专注于创建代码。如果你想更进一步,你可以找到一个剖析器,在生产环境本身中进行持续的剖析

在下一节中,我们将讨论两种工具--传统的剖析器和连续的剖析器--这样你就可以了解每种工具是如何为你的开发过程增加价值的。

剖析工具

gProfiler

gProfiler是一个连续的剖析工具,易于集成,并有一个漂亮的仪表盘,帮助你挖掘你的代码并找到瓶颈。它使你能够获得对生产环境的可见性。

gProfiler帮助你识别对性能影响最大的代码行,并为你提供更流畅的代码运行。

由于这些原因,我特别喜欢这个工具。

  • 优化代码的CPU使用率和运行成本
  • 在后台运行,所以不会消耗太多的资源
  • 找到生产环境本身的性能瓶颈
  • 提供无缝集成:即插即用

Pprof

开发人员中最受欢迎的剖析工具之一是'pprof'。pprof在运行时根据你选择的配置文件监控以下细节。

  • CPU使用率
  • 内存使用量
  • 线程和Goroutines
  • 区块
  • 突发事件

Pprof很容易使用,可以让你清楚地看到你的应用程序代码。尽管pprof是一个很好的工具,可以在你的应用程序中找到阻碍性能的代码,但你需要手动添加代码来监测上述的配置文件。这是pprof和gProfiler(前面讨论的连续剖析器)之间的关键区别点。

收尾工作

根据我的经验,当你开始一个新项目时,你不会面临性能问题。然而,随着项目代码库的增长,当你开始看到性能下降的时候,就会出现一个问题。

在性能下降变得难以忽视之前,忽视它绝不是一个好主意。如果你这样做,问题就会变得太大、太复杂,需要更长的时间来解决。你需要在瓶颈出现的时候解决它们。

在你的CI/CD管道中整合持续分析,给你关于你的应用程序性能变化的定期反馈。这带来了许多好处。

  • 减少基础设施成本。
  • 提高代码编写技巧。
  • 帮助你在遇到性能瓶颈时立即恢复。

编写性能驱动的代码是我们每个人都可以向往的事情。它可以帮助你少犯一些错误,使你的应用程序的性能下降。