我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang应用程序性能优化技巧分享

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang应用程序性能优化技巧分享

一、概述

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

二、关于性能优化的方向

延迟问题

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

资源效率

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

算法效率

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

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

1. 并行化 CPU 工作

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

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

//非并行版本

package main

import (
	"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() {
	//文件大小chennel
	fileSize := 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.6566073s
total size: 8.5GB
file count: 416088

//并行版本

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"path/filepath"
	"sync"
	"time"
)

const (
	//goTest目录
	TargetPath = "G:\\go"
)

var waitGroup sync.WaitGroup
var 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)
	<-ch
	if 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() {
	//文件大小chennel
	fileSize := 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.3528287s
total 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

2.go-json

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

14.预分配切片

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

15. 对map能使用 int就别string

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

四、总结

可靠性和应用程序性能都很重要。永远记住,应用程序性能速度是以毫不费力、开发时间和持续维护为代价的。如果您要构建 Golang 应用程序,了解上述提高 Golang 应用程序性能的提示和技巧将有助于您进行有效的应用程序开发。

以上就是Golang应用程序性能优化技巧分享的详细内容,更多关于Golang程序性能优化的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang应用程序性能优化技巧分享

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

下载Word文档

猜你喜欢

Golang应用程序性能优化技巧分享

随着科技的进步,人人都想要快速的应用,这就需要优化您的应用程序性能。本文为大家整理了一些Golang应用程序性能优化的技巧,希望对大家有所帮助
2023-05-15

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

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

golang函数缓存性能优化技巧分享

函数缓存是一种性能优化技术,可存储函数调用结果以进行重复使用,避免重复计算。在 go 中,可以通过使用 map 或 sync.map 实现函数缓存,并根据特定场景采用不同的缓存策略。例如,简单的缓存策略将所有函数参数用作缓存键,而细化的缓存
golang函数缓存性能优化技巧分享
2024-05-01

MySQL性能优化技巧分享

MySQL性能优化在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求。整理了一些在MySQL优化方面的实用技巧。Schema与数据类型优化整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREM
2022-05-20

PHP 应用程序性能优化中 Composer 的性能优化技巧

composer 优化技巧:禁用自动加载,避免在编译时加载不必要的类。使用 composer optimize 命令生成优化文件,减少加载类的时间。限制依赖项更新,避免频繁重新生成锁定文件。通过这些优化,可以大幅提升 php 应用程序的性能
PHP 应用程序性能优化中 Composer 的性能优化技巧
2024-05-01

Golang编译优化技巧分享

Golang编译优化技巧分享 为了提高Golang程序的性能和效率,优化编译过程是至关重要的。本文将分享一些Golang编译的优化技巧,并提供具体的代码示例供读者参考。一、使用编译器优化标志Golang编译器提供了一系列优化标志,通过
Golang编译优化技巧分享
2024-03-07

PHP 应用程序性能优化中 OPcache 配置的优化技巧

通过优化 opcache 配置,可以提升 php 应用程序性能。优化包括:设置合理的 opcache.memory_consumption 大小提高 opcache.max_accelerated_files 数值启用 opcache.re
PHP 应用程序性能优化中 OPcache 配置的优化技巧
2024-05-01

iOS程序性能优化的技巧

1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,
2022-05-15

Golang GraphQL API性能优化技巧

使用缓存、批处理、协程和数据库索引可以优化 graphql api 的性能,提升响应能力和吞吐量,有效避免应用程序在高负载下遇到的性能问题。Go GraphQL API 性能优化技巧前言GraphQL 是一种强大的查询语言,可用于创建灵
Golang GraphQL API性能优化技巧
2024-05-07

golang函数性能优化技巧

可以通过以下技巧优化 go 函数性能:使用缓存以避免重复计算。使用 goroutine 并发化计算以提高效率。对于关键计算使用汇编代码以提升性能。选择适当的数据结构,如 slice、map 和 channel,优化数据存储和检索。避免不必要
golang函数性能优化技巧
2024-04-27

Golang函数方法优化技巧分享

Golang函数方法优化技巧分享Golang作为一种快速、高效的编程语言,拥有许多强大的特性和优化方法,能够帮助开发者编写性能高效的程序。在Golang中,函数是非常重要的一部分,优化函数的性能可以显著提升整个程序的运行效率。本文将分享一
Golang函数方法优化技巧分享
2024-03-12

PHP 应用程序性能优化中的请求处理技巧

php 应用程序中优化请求处理包含 3 个关键技巧:利用缓存机制存储经常请求的数据。优化数据库查询,包括使用索引、限制查询大小和利用 join。减少 http 请求,通过合并 css sprites 和图像合并等技术。PHP 应用程序性能优
PHP 应用程序性能优化中的请求处理技巧
2024-05-05

用 PHP 框架优化应用程序性能的技巧和策略

用 PHP 框架优化应用程序性能的技巧和策略缓存使用缓存系统(如 Memcached 或 Redis)来存储经常访问的数据,以减少对数据库的查询次数。启用 opcode 缓存(如 APC 或 XCache)以存储编译后的 PHP 代码,
用 PHP 框架优化应用程序性能的技巧和策略
2024-05-24

Golang文件读取优化:提升程序性能的小技巧

Golang是一门以高效和快速著称的编程语言,但在文件读取方面,如果不小心就会陷入性能瓶颈。本文将讨论Golang中文件读取的优化,介绍能够提升程序性能的小技巧,并附带具体的代码示例。使用缓冲区在Golang中,文件读取时每读一个字节都
Golang文件读取优化:提升程序性能的小技巧
2024-01-19

提高Node.js性能的应用技巧分享

一、实现一个反向代理服务器相比大多数应用服务器,Node.js 可以很轻松的处理大量的网络流量,但这并不是 Node.js 的设计初衷。 如果你有一个高流量的站点,提高性能的第一步是在你的 Node.js 前面放一个反向代理服务器。这可以保
2022-06-04

Golang函数性能优化之优化技巧合集

通过应用以下技巧可优化 go 函数性能:1. 使用基准测试识别瓶颈;2. 避免动态分配,使用静态分配;3. 优化算法,如使用二分查找;4. 减少函数调用开销,内联代码或分解函数;5. 使用并发并行执行任务。运用这些技巧,可极大提升函数效率,
Golang函数性能优化之优化技巧合集
2024-04-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录