首页 > 其他分享 >深入研究:Go语言文件写入的性能差异 原创 Go先锋 Go先锋

深入研究:Go语言文件写入的性能差异 原创 Go先锋 Go先锋

时间:2023-10-28 13:44:26浏览次数:25  
标签:文件 log err 写入 先锋 file Go

深入研究:Go语言文件写入的性能差异

原创 Go先锋 Go先锋 2023-10-28 11:03 发表于广东 收录于合集 #Go语言包22个 #性能效率1个

Go 先锋

读完需要

7分钟

速读仅需 3 分钟

   

概述

在 Go 语言开发中,文件操作是一个非常常见的任务。在不同的应用场景下,可能会面临选择使用哪种写文件方式的问题。

本文将详细探讨 Go 语言中几种写文件的方式,包括普通文件写入、缓冲写入和并发写入。

通过性能对比为你解析何时选择何种方式,以及如何最大程度地提升文件写入效率。

主要内容包括

  • 普通文件写入

  • 缓冲写入

  • 并发写入

  • 性能对比与分析

  • 最佳实践建议

 

   

1. 普通文件写入

1.1 使用 os.Write 进行文件写入

func WriteUsingOsWrite() {    file, err := os.Create("output.txt")    if err != nil {        log.Fatal(err)    }    defer file.Close()
content := []byte("Hello, World!") _, err = file.Write(content) if err != nil { log.Fatal(err) }}

1.2 使用 fmt.Fprintf 进行格式化文件写入

func WriteUsingFmtFprintf() {    file, err := os.Create("output.txt")    if err != nil {        log.Fatal(err)    }    defer file.Close()
fmt.Fprintf(file, "Hello, %s!", "World")}

 

   

2. 缓冲写入

2.1 使用 bufio.NewWriter 进行缓冲写入

func WriteUsingBufferedWriter() {    file, err := os.Create("output.txt")    if err != nil {        log.Fatal(err)    }    defer file.Close()
writer := bufio.NewWriter(file) _, err = writer.WriteString("Hello, World!") if err != nil { log.Fatal(err) }    writer.Flush()}

 

2.2 使用 ioutil.WriteFile 进行缓冲写入

func WriteUsingIoutilWriteFile() {    content := []byte("Hello, World!")    err := ioutil.WriteFile("output.txt", content, 0644)    if err != nil {        log.Fatal(err)    }}

 

   

3. 并发写入

3.1 使用 goroutine 进行并发写入

func ConcurrentWriteUsingGoroutine() {    var wg sync.WaitGroup        content := "Hello, World!"
for i := 0; i < 10; i++ { wg.Add(1) go func(index int) { defer wg.Done() file, err := os.Create(fmt.Sprintf("output_%d.txt", index)) if err != nil { log.Fatal(err) } defer file.Close()
_, err = file.WriteString(content) if err != nil { log.Fatal(err) } }(i) }
wg.Wait()}

3.2 使用 sync 包进行并发控制的写入

func ConcurrentWriteUsingSync() {  var mu sync.Mutex  content := "Hello, World!"
  for i := 0; i < 10; i++ {     go func(index int) {      file, err := os.Create(fmt.Sprintf("output_%d.txt", index))         if err != nil { log.Fatal(err)         } defer file.Close()
mu.Lock()        _, err = file.WriteString(content)         mu.Unlock()
if err != nil { log.Fatal(err) } }(i) }
time.Sleep(time.Second) // 等待goroutines执行完成}

 

   

4. 性能对比与分析

4.1 测试环境和方法

在一台标准配置的机器上,分别运行了以上的不同写入方式,并使用性能分析工具收集了数据。

4.2 性能数据收集

测试了不同文件大小和并发数量下的性能表现,并记录了每种写入方式的执行时间和 CPU 占用。

4.3 数据分析和结论

通过对比性能数据,得出了不同场景下每种写入方式的优劣。

在小文件写入时,普通文件写入方式即可满足需求;在大文件写入时,缓冲写入方式的性能更优。

在需要并发写入时,使用goroutine和sync包进行并发控制可以提高效率。

 

   

5. 最佳实践建议

5.1 根据场景选择最合适的写入方式

根据需求选择最适合的文件写入方式,普通写入、缓冲写入或并发写入,以提高程序性能。

5.2 避免频繁的文件打开和关闭

在循环中频繁打开和关闭文件会增加系统调用开销,尽量在循环外定义文件指针,减少文件操作。

5.3 并发写入时的注意事项

在并发写入时,注意并发控制,可以使用sync包中的Mutex进行加

锁,保证多个goroutine之间的安全写入。

通过本文的性能对比和最佳实践建议,相信读者的你能够更加高效地选择和使用不同的文件写入方式,提升你的程序性能,确保在不同场景下都能够处理文件写入任务。

 

收录于合集 #Go语言包  22个 上一篇高效Go语言编程:os包实用技术大揭示   阅读 97 Go先锋 ​ 喜欢此内容的人还喜欢   时间旅行者的工具箱:Go语言time包解读     我看过的号 Go先锋 不看的原因   云原生系列Go语言篇-泛型     AlanHou 不看的原因   LangChain 的 Go 语言实现     我关注的号 GitHub精选 不看的原因   写留言            

人划线

 

标签:文件,log,err,写入,先锋,file,Go
From: https://www.cnblogs.com/cheyunhua/p/17794014.html

相关文章

  • Python 框架学习 Django篇 (六) 数据表关联、ORM关联
    在后端服务器开发中,特别是前后端分离的架构中数据库是非常重要的,后端主要就是负责管理数据,而我们经常使用的mysql、oracle都是关系型数据库,什么是关系型数据库?就是建立在关系模型基础上的数据库,而最难处理的就是各个表之间的关联关系,一般这种关系分为三种:一对一、一对多、多对......
  • Python 框架学习 Django篇 (六) ORM关联
    像是上一章我们很少会通过页面点击去添加和绑定关系表,更多的时候都是通过django的语法实现,接下来我们做一个案例djangorom是怎么操作外键关系的创建mode模型表Django_demo/mgr/models.py#国家表classCountry(models.Model):name=models.CharField(max_length=100)#......
  • [TopCoder 13001] BigO 题解
    [TopCoder13001]BigO题解题目描述给定一张有向图,当\(L\)趋近于无穷大时,长度为\(L\)的路径条数有\(S\)条,此时若\(S=O(L^k)\),输出\(k\),否则如果没有多项式的大O表示法,输出\(-1\)。指数情况首先如果一张图中存在如下强连通分量,则\(S=O(2^L)\)。因为每次到1......
  • Python 利用pandas和mysql-connector获取Excel数据写入到MySQL数据库
    如何将Excel数据插入到MySQL数据库中在实际应用中,我们可能需要将Excel表格中的数据导入到MySQL数据库中,以便于进行进一步的数据分析和处理。本文将介绍如何使用Python将Excel表格中的数据插入到MySQL数据库中。导入必要的库首先,我们需要导入pandas库和MySQLConnector/Python库......
  • python django项目安装虚拟环境
    开发环境搭建1.虚拟环境+库安装django(mac使用python3)python-mvenvmyvenvmyvenv\Scripts\activate.batpipinstallDjango 2.startproject项目创建python-mdjangostartprojectdjangosite 3.startapp应用程序创建cddjangosite(外面的djangosite)......
  • CSI摄像头模组MIPI配套GOWIN国产NR-9C和2AR-18开发板FPGA
    1.概述    国产FPGA是最近几年起来的产品,具有性价比高特点。而GOWIN属于国产FPGA成员,在技术服务和芯片价格都是比较大的优势,很多用户都用在LED控制,电机控制,PLC设备上,以及用于替换Lattice厂家中低端的芯片。   MIPI是移动联盟关键协议。用低功耗和高速传输摄像头和屏的内......
  • golang 中使用 writev (sendmsg) 系统调用来一次发送多块数据
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯writev,或者说sendmsg等系统调用,能够发送多个数据块。从节约系统调用次数的角度说,这个api非常好。下面演示如何在golang中使用sendmsg系统调用:funcsendmsg......
  • szfpga 高云gowin国产开发板GW2AR-18核心板fpga cpld测试板
    1.概述         国产FPGA是最近几年起来的产品,具有性价比高特点。而GOWIN属于国产FPGA成员,在服务和芯片都是比较大的优势,很多用户都用在LED控制,电机控制,PLC设备上,以及用于替换Lattice厂家中低端的芯片。    GW2AR-18 开发板采用GW2AR-18-LV9EQ144器件,是属于晨......
  • Django和Vue.js是两种不同的框架,它们各自有自己的特点和用途¹。 **Django**¹: - Dja
    Django和Vue.js是两种不同的框架,它们各自有自己的特点和用途¹。**Django**¹:-Django是一个开放源代码的PythonWeb应用框架¹。-它采用了MTV(模型,视图,模板)的软件设计模式¹。-Django可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序¹。-Django还包含许多功能......
  • Google Test 示例代码
    TODO:全局环境和监听事件在运行过程中的顺序。https://gitee.com/boluanace/googletest/blob/master/googletest/test/googletest-listener-test.cc参考资料https://github.com/google/googletest/tree/main/googletest/test未完待续......未经作者授权,禁止转载THEEND......