iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang应用程序性能优化技巧有哪些
  • 243
分享到

Golang应用程序性能优化技巧有哪些

2023-07-06 00:07:30 243人浏览 泡泡鱼
摘要

这篇文章主要讲解了“golang应用程序性能优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang应用程序性能优化技巧有哪些”吧!一、概述随着科技的进步,人人都想要快速的应

这篇文章主要讲解了“golang应用程序性能优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang应用程序性能优化技巧有哪些”吧!

    一、概述

    随着科技的进步,人人都想要快速的应用,用户想要快速的交付,开发者想要快速的性能,创业者想要两者兼而有之。这就需要优化您的应用程序性能。您需要提高应用程序的速度和性能,使其成为市场上最好的。您想要优化 Golang 应用程序的主要原因有两个——资源效率和改善操作延迟。您的应用程序的最终目标应该是它不需要太多资源而继续等待操作。尽管您的 Golang 应用程序太复杂以至于无法执行其中一项任务,但它必须依赖另一项任务,这样一来,它就变成了一个死循环的依赖项。

    二、关于性能优化的方向

    延迟问题

    延迟优化需要分析程序的瓶颈。主要目的在于优化特定功能的延迟。当您提高程序的资源效率时,延迟会自动改善。然而,改善延迟可能需要增加资源消耗。故此,我们需要意识到程序的瓶颈和热点,并同时处理这些问题。

    资源效率

    您可以提高应用程序性能以优化资源使用。程序的某些部分比其他部分需要更多的资源,您应该为您的应用程序找到这样的热点。如 CPU、带宽或内存。

    算法效率

    通常程序可以采用不同的算法来执行相同的操作,但效率往往因为各种因素不一而产生不一样的效果,所以通过实施算法优化,我们可以最大限度地提高应用程序的性能。

    三、提高 Golang 应用程序性能的最佳实践

    1. 并行化 CPU 工作

    同步需要花费大量时间,当您使用可用内核并行工作时,它肯定会优化 Golang 应用程序性能。这是线性加速应用程序执行的重要一步。这也属于Golang相对于其他语言的天然优势(自带弹药库)。另外并行不一定最优,但能并行的场景,必然对我们有利,因为Golang天生丽质。

    下面我们以计算也给目录的文件总大小为例。分别以非并行和并行两种方式进行对比

    //非并行版本

    package mainimport ("fmt""io/ioutil""log""path/filepath""time")const (//目标目录TargetPath = "G:\\go")// 递归计算目录下所有文件func walkDir(path string, fileSize chan<- int64) {fmt.Printf("\rwalk ... %s\n", path)entries, err := ioutil.ReadDir(path)if err != nil {log.Fatal(err)return}for _, e := range entries {if e.IsDir() {walkDir(filepath.Join(path, e.Name()), fileSize)} else {fileSize <- e.Size()}}}func main() {//文件大小chennelfileSize := make(chan int64)//文件总大小var sizeCount int64//文件数目var fileCount int//计算目录下所有文件占的大小总和go func() {walkDir(TargetPath, fileSize)defer close(fileSize)}()t := time.Now()for size := range fileSize {fileCount++sizeCount += size}fmt.Println("used time: " + time.Since(t).String())fmt.Printf("total size: %.1fGB\nfile count: %d\n", float64(sizeCount)/1e9, fileCount)}//-------------结果---------------used time: 41.6566073stotal size: 8.5GBfile count: 416088

    //并行版本

    package mainimport ("fmt""io/ioutil""log""path/filepath""sync""time")const (//goTest目录TargetPath = "G:\\go")var waitGroup sync.WaitGroupvar ch = make(chan struct{}, 255)// 递归计算目录下所有文件func walkDir(path string, fileSize chan<- int64) {defer waitGroup.Done()fmt.Printf("\rwalk ... %s\n", path)ch <- struct{}{} //限制并发量entries, err := ioutil.ReadDir(path)<-chif err != nil {log.Fatal(err)return}for _, e := range entries {if e.IsDir() {waitGroup.Add(1)go walkDir(filepath.Join(path, e.Name()), fileSize)} else {fileSize <- e.Size()}}}func main() {//文件大小chennelfileSize := make(chan int64)//文件总大小var sizeCount int64//文件数目var fileCount int//计算目录下所有文件占的大小总和waitGroup.Add(1)go walkDir(TargetPath, fileSize)go func() {defer close(fileSize)waitGroup.Wait()}()t := time.Now()for size := range fileSize {fileCount++sizeCount += size}fmt.Println("used time: " + time.Since(t).String())fmt.Printf("total size: %.1fGB\nfile count: %d\n", float64(sizeCount)/1e9, fileCount)}//-------------结果---------------used time: 7.3528287stotal size: 8.5GB file count: 416088

    很明显,我们采用并行方式后,程序的运行效率提升了接近6倍,所以,我们在适当场景下使用合适的方式进行并行编程,就能为我们程序带来意想不到的效果。当然上面的代码有些瑕疵,例如goroutine的创建不应该手动,而应该使用协程池等方式。

    2.观察你的超时

    通常,输入输出操作需要更多时间,从而导致延迟。要克服这个问题,您应该避免在不知道其将消耗的时间的情况下执行任何 I/O 任务。在为每个网络请求设置超时之前,您应该使用 SetDeadline、SetReadDeadline 和 SetWriteDeadline。

    3. 使 I/O 操作异步

    最常见的瓶颈是由于网络事务和文件输入/输出执行造成的。因此,为了优化您的 Golang 应用程序性能,您可以使独立的 I/O 异步。以这种方式,此类操作并行运行并改善下游延迟。此外,您可以使用 sync.WaitGroup 来同步多个 I/O 操作。

    4.减少Goroutines的使用

    使用 Goroutines 非常便宜且易于使用,这让我们觉得它几乎是免费的。但 goroutines 确实会占用大量内存,从而影响应用程序性能。通常,Go 开发人员会在不计算或不知道何时退出的情况下创建无限的 goroutine。因此,建议您仅在知道 goroutine 何时退出时才启动它。采用协程池来进行管理,我们不再赘述如何创建一个协程池,其他章节中我们将重点介绍。

    5. 使用无算法

    您应该避免同步,因为它会导致竞争。为了提高延迟和效率,您应该防止互斥。许多无锁解决方案可用于一些常见的数据结构。如果确实需要锁,你首选的应该为atomic,然后才为mutex。

    6. 使用已编译的正则表达式

    有些程序可能会多次使用同一个正则表达式,如果在每次使用前都编译正则表达式,应用程序会很低效。因此,对于重复匹配,您应该使用已编译的正则表达式。 性能差距还是很明显的,需要注意。

    7.避免使用cgo

    Go 程序可以通过使用 cgo 调用 C 库。但是cgo函数的开销很大,它在运行过程中会消耗线程,就像阻塞I/O一样。您不应该在紧密循环之间调用 C 代码。为了 Golang 应用程序的最佳性能,最好避免使用 cgo。后续的文章中我们将介绍如何优化cgo的性能。(既然不得不用,那么将如何用好cgo)

    8.不要在热点分配内存

    当您创建新对象时,系统会消耗内存和 CPU 周期,从而增加延迟。它占用GC效率,所以频繁创建对象可不是个好事情,尤其是在热点地区。因此,只要有可能,您应该重用对象,考虑sync.Pool

    9.用好sync.RWMutex

    同步的重对象的完全锁定,goroutines 需要等待很长时间。因此在读多写少的场景中,优先考虑sync.RWMutex

    10. 在文本格式上使用二进制 -

    两种二进制文本格式在 Postgressql 中均有效。但是二进制比文本格式快。使用二进制形式时,仅在从网络字节序转换时才需要处理。因此,对于 PostgresSQL 服务器,二进制格式比文本格式的传输效率更高。

    11. 利用缓冲 I/O-

    访问单个对象需要磁盘操作,这会破坏程序的效率。使用缓冲输入/输出将有效地提高您的应用程序速度,它必须读取和写入更大的数据块。

    12. 更喜欢使用 StringBuffer 或 StringBuilder-

    使用“+”和“+=”运算符,系统在每次赋值时分配一个新字符串。为了克服这种低效率,您应该使用 StringBuffer 和 StringBuilder 来快速执行您的程序。具体见我另一篇文章:再论Golang字符串拼接问题

    13. 选择 Protocol Buffers 和 MessagePack

    避免使用官方提供的Gob 和 JSON 作为序列化反序列化方案,因为它们使用了反射,实现的方式相当丑陋。我们推荐应该使用 Protocol Buffers 和 MessagePack作为二进制的序列化方案,当然你非要用json序列化和反序列化,我们给出社区中给出的两种技术方案,都对JSON的操作进行性能上的优化。

    1.sonic

    sonic 是字节跳动开源的一款 Golang JSON 库,基于即时编译(Just-In-Time Compilation)与向量化编程(Single Instruction Multiple Data)技术,大幅提升了 Go 程序的 JSON 编解码性能。同时结合 lazy-load 设计思想,它也为不同业务场景打造了一套全面高效的 api。自 2021 年 7 月份发布以来, sonic 已被抖音、今日头条等业务采用,累计为字节跳动节省了数十万 CPU 核。

    项目地址:sonic

    Golang应用程序性能优化技巧有哪些

    2.go-json

    go-json与其他库相比,在编码和解码方面都非常快。 通过使用自动代码生成来提高性能或使用专用接口,它更容易实现,但敢于坚持与 并且是简单接口的兼容性。另外它高度兼容系统json库,所以你可以快速在你的项目中进行替换使用。它采用对象池,避免反射等手段进行优化。

    Golang应用程序性能优化技巧有哪些

    14.预分配切片

    当您的需求达到其当前容量时,Golang 会自动分配内存。在重新分配期间,系统会在数据移动到新位置时新的内存。为了避免这种内存浪费和不必要的垃圾收集,您应该尽可能预分配足够的使用内存。切片不是List,所以不要以为 var s =[]int={},以后直接append就好了,因为不断的扩容会带来无穷的性能损害。

    15. 对map能使用 int就别string

    如果您的应用程序使用map,那么您应该在可以使用int作为key时就不要用string作为key。

    感谢各位的阅读,以上就是“Golang应用程序性能优化技巧有哪些”的内容了,经过本文的学习后,相信大家对Golang应用程序性能优化技巧有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    您可能感兴趣的文档:

    --结束END--

    本文标题: Golang应用程序性能优化技巧有哪些

    本文链接: https://www.lsjlt.com/news/356910.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Golang应用程序性能优化技巧有哪些
      这篇文章主要讲解了“Golang应用程序性能优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang应用程序性能优化技巧有哪些”吧!一、概述随着科技的进步,人人都想要快速的应...
      99+
      2023-07-06
    • Golang应用程序性能优化技巧分享
      目录一、概述二、关于性能优化的方向延迟问题资源效率算法效率三、提高 Golang 应用程序性能的最佳实践1. 并行化 CPU 工作2.观察你的超时3. 使 I/O 操作异步4.减少G...
      99+
      2023-05-15
      Golang程序性能优化技巧 Golang程序性能优化 Golang性能优化
    • Java应用程序性能调优技巧有哪些
      这篇文章将为大家详细讲解有关Java应用程序性能调优技巧有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。大多数开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识。好吧,不能说这是...
      99+
      2023-05-30
      java
    • Java程序性能优化的编程技巧有哪些
      本篇内容主要讲解“Java程序性能优化的编程技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序性能优化的编程技巧有哪些”吧!1、慎用异常在Java软件开发中,经常使用 try-...
      99+
      2023-06-17
    • python性能优化技巧有哪些
      小编给大家分享一下python性能优化技巧有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!性能优化技巧1. 限制CPU和内存使用量如果Python程序占用资源...
      99+
      2023-06-27
    • SQL性能优化技巧有哪些
      这篇文章给大家分享的是有关SQL性能优化技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.查询的模糊匹配尽量避免在一个复杂查询里面使用 LIKE '%parm1...
      99+
      2022-10-19
    • JavaScript性能优化技巧有哪些
      这篇文章主要为大家展示了“JavaScript性能优化技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript性能优化技巧有哪些”这篇文章吧...
      99+
      2022-10-19
    • vue性能优化技巧有哪些
      这篇文章主要介绍“vue性能优化技巧有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue性能优化技巧有哪些”文章能帮助大家解决问题。gzip压缩在所有的web前台项目,静态资源基本都放在cdn...
      99+
      2023-07-04
    • 有哪些Java性能优化技巧
      这篇文章主要讲解了“有哪些Java性能优化技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Java性能优化技巧”吧!  1.在你确认必要之前不要优化  你应该遵循常见的最佳实践做法并...
      99+
      2023-06-02
    • docker优化性能的技巧有哪些
      以下是一些优化Docker性能的技巧: 使用多阶段构建:多阶段构建可以减小镜像的大小,从而提高构建和部署的性能。 使用合适的...
      99+
      2023-10-25
      docker
    • Android性能优化的技巧有哪些
      这篇“Android性能优化的技巧有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android性能优化的技巧有哪些”文...
      99+
      2023-06-04
    • Java性能的优化技巧有哪些
      这篇文章主要讲解了“Java性能的优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java性能的优化技巧有哪些”吧!1.对象的生成和大小的调整。 JAVA程序设计中一个普遍的问题...
      99+
      2023-06-17
    • mongodb性能优化的技巧有哪些
      以下是一些MongoDB性能优化的技巧: 索引优化:使用合适的索引可以大大提高查询性能。使用explain()命令来分析查询性能...
      99+
      2023-10-25
      mongodb
    • Web性能优化的技巧有哪些
      这篇文章主要介绍了Web性能优化的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web性能优化的技巧有哪些文章都会有所收获,下面我们一起来看看吧。1. 使用文本压缩使用文本压缩,可以最大程度地减少通过...
      99+
      2023-06-27
    • 在Golang中优化代码以提高性能的技巧有哪些
      本篇内容介绍了“在Golang中优化代码以提高性能的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!作为一名软件工程师,确保你的代码...
      99+
      2023-07-05
    • python代码性能优化技巧有哪些
      python优化代码性能技巧:1.优化字符串;2.减少循环;3.优化算法;python中优化代码性能的技巧有以下几种优化字符串python中字符串对象是不可改变的,在对字符串进行拼接等操作时,会产生一个新的字符串对象,从而会在一定程度上影响...
      99+
      2022-10-09
    • 程序体积优化的技巧有哪些
      这篇文章主要讲解了“程序体积优化的技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“程序体积优化的技巧有哪些”吧!strip使用在Linux中可以使用...
      99+
      2022-10-19
    • iOS程序性能优化的技巧
      1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内...
      99+
      2022-05-15
      ios 程序 性能 优化
    • php性能优化函数有哪些使用技巧?
      对于使用PHP开发的网站或应用程序来说,性能优化是非常重要的。一个高性能的网站能够提供更好的用户体验,同时也能够减少服务器的负载。在优化PHP性能中,我们需要关注一些特定的函数和技巧。下面是一些常见的PHP性能优化函数的使用技巧。使用缓存函...
      99+
      2023-10-21
      压缩 调试 优化技巧:缓存
    • DB2数据库性能优化技巧有哪些
      今天就跟大家聊聊有关DB2数据库性能优化技巧有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  打开DB2数据库监视开关,获取需要的性能信息最简...
      99+
      2022-10-19
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作