golang程序性能提升改进篇之文件的读写---第一篇

背景:接手的项目是golang开发的(本人初次接触golang)经常出现oom。这个程序是计算和io密集型,调用流量属于明显有波峰波谷,但是因为各种原因,当前无法快速通过serverless或者动态在高峰时段调整资源,低峰释放资源的方式进行解决,因此只能通过分析内存和cpu消耗热点,然后改动代码,进而解决服务的稳定性和性能问题。

思路
通过搜索了解golang程序如何进行性能分析,当时就是使用pprof了,通过分析发现了程序有一些使用内存较多的地方,例如我们读取大量文件,通过分析发现io.ioutil.ReadAll消耗内存较多,通过查询发现io.copy可以减少一些内存消耗。

在这里插入图片描述

同时也在网上发现其他开源项目与我们遇到的情况类似。 https://github.com/elastic/beats/issues/36151是某个开源软件中将ioutil.ReadAll 更新为io.Copy的讨论,里面也有他们的对比测试 。

性能对比测试:

在本机上写了一段代码,ioutil.ReadAll和io.Copy的go benchmarktest结果如下
在这里插入图片描述

代码比较简单 main.go

package mainimport ("bytes""fmt""io""io/ioutil""net/http""time"
)func fetchWithReadAll(url string) ([]byte, time.Duration, error) {// 发起HTTP GET请求resp, err := http.Get(url)if err != nil {return nil, 0, err}defer resp.Body.Close()// 使用 io.ReadAll 读取响应内容start := time.Now()data, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, 0, err}duration := time.Since(start)return data, duration, nil
}func fetchWithCopy(url string) ([]byte, time.Duration, error) {// 发起HTTP GET请求resp, err := http.Get(url)if err != nil {return nil, 0, err}defer resp.Body.Close()// 使用 io.Copy 读取响应内容start := time.Now()var buffer bytes.Buffer_, err = io.Copy(&buffer, resp.Body)if err != nil {return nil, 0, err}duration := time.Since(start)return buffer.Bytes(), duration, nil
}func main() {//  此url能下载一个大约1-2mb的文本文件url := "http://x.y.z/abc.txt"// 测试 ioutil.ReadAlldataReadAll, durationReadAll, err := fetchWithReadAll(url)if err != nil {fmt.Printf("Error fetching with ReadAll: %v\n", err)return}fmt.Printf("ReadAll took %v for %d bytes\n", durationReadAll, len(dataReadAll))// 测试 io.CopydataCopy, durationCopy, err := fetchWithCopy(url)if err != nil {fmt.Printf("Error fetching with Copy: %v\n", err)return}fmt.Printf("Copy took %v for %d bytes\n", durationCopy, len(dataCopy))
}

main_test.go

package mainimport ("testing"
)// 假设我们已有 fetchWithReadAll 和 fetchWithCopy 函数定义// BenchmarkFetchWithReadAll 为 fetchWithReadAll 函数编写基准测试。
func BenchmarkFetchWithReadAll(b *testing.B) {//  此url能下载一个大约1-2mb的文本文件url := "http://x.y.z/abc.txtb.ReportAllocs()for i := 0; i < b.N; i++ {_, _, err := fetchWithReadAll(url)if err != nil {b.Error(err)}}
}// BenchmarkFetchWithCopy 为 fetchWithCopy 函数编写基准测试。
func BenchmarkFetchWithCopy(b *testing.B) {//  此url能下载一个大约1-2mb的文本文件url := "http://x.y.z/abc.txt"b.ReportAllocs()for i := 0; i < b.N; i++ {_, _, err := fetchWithCopy(url)if err != nil {b.Error(err)}}
}

最后执行
···
go test -bench=.

···

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS之数组中的reduce方法

文章目录 基本语法&#xff1a;callbackFn 的参数:例子1. 数组求和2. 数组求积3. 扁平化数组4. 数组元素计数5. 使用对象解构和展开运算符合并数组中的对象6. 求最大值和最小值 函数组合异步操作中的 reduce总结 reduce 是 JavaScript 中 Array 对象的一个方法&#xff0c;非常…

MySQL InnoDB【事务模型】之【事务隔离级别】 全攻略

快速导航 事务隔离级别可重复读&#xff08;REPEATABLE READ&#xff09;读提交内容&#xff08;READ COMMITTED&#xff09;读未提交内容&#xff08;READ UNCOMMITTED&#xff09;可串行化&#xff08;SERIALIZABLE&#xff09; 事务隔离级别 事务隔离是数据库处理的基础之一…

「邀您参会」首个中国可观测日即将盛大开幕

在云计算领域不断探索与创新的背景下&#xff0c;亚马逊云科技与观测云今日宣布&#xff0c;将联合举办中国可观测日&#xff08;Observability Day&#xff09;活动&#xff0c;旨在深化双方合作&#xff0c;共同推动中国可观测性的发展。 中国站首站&#xff0c;选址上海&am…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

使用html2canvas实现图片或者dom元素的样式展示

html或者.vue.tsx模板 <div class"tan1" id"tan1"><div class"jiang" id"jiangImg1" style"margin: 1rem auto 0;width: 75%;height: 10rem;position: relative;background-color: transparent;"><img id&q…

Laravel数据库的魔法棒:深入探索数据库迁移(Migrations)

Laravel数据库的魔法棒&#xff1a;深入探索数据库迁移&#xff08;Migrations&#xff09; 在Laravel的世界中&#xff0c;数据库迁移&#xff08;Migrations&#xff09;是一种强大的工具&#xff0c;它允许开发者以版本控制的方式管理数据库结构的变化。通过迁移&#xff0…

中级java每日一道面试题-2024年7月17日

面试官: 操作字符串都有哪些类?它们之间有什么区别? 我回答: String 描述&#xff1a;String是最基本的字符串类&#xff0c;用于表示不可变的字符序列。一旦创建了一个String对象&#xff0c;其内容就不能被改变。特性&#xff1a; 不可变性&#xff08;Immutability&#…

【启明智显方案分享】工业级HMI芯片MODEL3\MODEL4应用于电梯系统多媒体

一、方案概述 本方案采用工业级HMI芯片MODEL3或MODEL4作为核心处理器&#xff0c;结合7寸以上高清显示屏&#xff0c;为电梯系统提供多媒体解决方案。该方案不仅能够显示日期、时间、楼层信息等基础信息&#xff0c;还能播放广告、通知、视频等多媒体内容&#xff0c;增强电梯…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述&#xff1a; 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

友讯随身WiFi和格行随身WiFi真实测评!彩屏款随身WiFi谁更胜一筹?随身WiFi哪个最好用?随身WiFi哪个口碑最好?哪个性价比更高?

在众多随身WiFi品牌中&#xff0c;友讯&#xff08;D-Link&#xff09;与格行&#xff08;Gexing&#xff09;都是彩屏款随身WiFi因其相似的设计和各自独特的品牌背景&#xff0c;常常让消费者难以抉择。今天&#xff0c;我们就来一场真实测评&#xff0c;深入剖析这两款彩屏随…

求解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办

Talk|清华大学袁天远:PreSight - 利用NeRF先验帮助自动驾驶场景在线感知

本期为TechBeat人工智能社区第605期线上Talk。 北京时间7月3日(周三)20:00&#xff0c;清华大学博士生—袁天远的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “PreSight - 利用NeRF先验帮助自动驾驶场景在线感知”&#xff0c;他向大家介绍了新…

【XSS】

文章目录 0x01 简介0x02 XSS Payload用法XSS攻击平台及调试JavaScript 0x03 XSS构造技巧XSS漏洞防御策略 跨站脚本攻击&#xff0c;Cross Site Script。&#xff08;重点在于脚本script&#xff09; 分类 反射型、存储型DOM型 漏洞原理&#xff1a;通过插入script篡改“HTML”…

Kotlin Flow:掌握基本,征服应用,避开开发陷阱!

文章目录 1. 前言2. Kotlin Flow基本概念2.1 什么是数据流&#xff1f;2.2 Kotlin Flow是什么&#xff1f;2.3 有了LiveData和协程&#xff0c;为啥还需要Kotlin Flow&#xff1f;2.4 相比RxJava&#xff0c;Kotlin Flow有什么优势? 3. 基本使用3.1 Flow的创建和消费3.2 操作符…

AI 生成时代,现有编程语言还够用吗?

7月14日下午&#xff0c;知乎「AI 先行者沙龙」在深圳南山举行&#xff0c;本次沙龙以 “探航” 为主题&#xff0c;粤港澳大湾区数字经济研究院基础软件中心首席科学家、MoonBit 平台负责人张宏波受邀发表主旨演讲——《AI 生成时代&#xff0c;现有编程语言还够用吗&#xff…

PyTorch论文

2019-12 PyTorch: An Imperative Style, High-Performance Deep Learning Library 设计迎合4大趋势&#xff1a; 1. array-based (Tensor) 2. GPU加速 3. 自动求导 (Auto Differentiation) 4. 拥抱Python生态 4大设计原则&#xff1a; 1. 使用算法和数据开发者熟悉的Python做编…

华为USG6000V防火墙NAT智能选举

目录 一、拓扑图 二、要求 三、配置思路及方法 要求1&#xff1a;通过多对多的NAT实现上网功能 思路&#xff1a;基础IP地址配置按照之前的进行配置&#xff0c;接着在策略里配置多对多的NAT 要求2&#xff1a;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的…

stm32入门-----GPIO口输入的学习与使用

目录 前言 一、硬件介绍 1.按键 2.传感器模块 二、按键控制LED灯亮灭 1.电路连线图 2. 工程文件添加 3.GPIO口读取函数介绍 &#xff08;1&#xff09;输入数据的读取 &#xff08;2&#xff09;输出数据的读取 4.代码编写 &#xff08;1&#xff09;按键模块 …

简述MVVM?

什么是MVVM&#xff1f; MVVM: Model-View-ViewModel 视图模型双向绑定 Model: 数据模型 View: UI组件 ViewModel: 是View和Model层的桥梁&#xff0c;数据会绑定到viewModel层并自动将数据渲染到页面中&#xff0c;视图变化的时候会通知viewModel层更新数据。 以前是操作…

SQLite DISTINCT 关键字

SQLite DISTINCT 关键字 SQLite 是一种轻量级的数据库管理系统&#xff0c;广泛用于各种应用程序中。它提供了一个强大的查询语言&#xff0c;包括 DISTINCT 关键字&#xff0c;用于去除查询结果中的重复行&#xff0c;只返回唯一的记录。 1. DISTINCT 关键字的基本用法 DIS…