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,一经查实,立即删除!

相关文章

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

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

软件测试——非功能测试

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

【启明智显方案分享】工业级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”…

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;按键模块 …

智能制造 v3.13.16 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

java:aocache 与Spring Aop兼容问题

本文适用于所有AspectJ与Spring AOP混用的场景。 Spring AOP 是基于动态代理的实现AOP&#xff0c;基于 JDK代理和CGLib代理实现运行时织入&#xff08;runtime weaving&#xff09;。 Spring AOP的切面定义沿用了ASpectJ的注解体系&#xff0c;所以在Spring体系中注解定义切面…

this关键字、static关键字(静态变量、静态方法、静态代码块)、代码块、包

一、this关键字 1、使用区域&#xff1a;定义类时在类的方法中使用&#xff0c;包括构造方法和成员方法 2、特点&#xff1a;表示Java程序运行时正在调用此方法的对象 3、使用范围&#xff1a; &#xff08;1&#xff09;引用当前对象中的成员变量 典例&#xff1a;用于区…

MySQL-事务、日志

事务 特性 原子性 是指事务开始后&#xff0c;必须成功执行完所有的操作才会结束&#xff0c;否则会回滚到事务刚开始前。 拿转账来说&#xff0c;一个成功的 A向B转账100元的过程 会涉及如下过程&#xff1a; A&#xff1a;从数据库读取A的余额&#xff1b;A的余额-100&am…

QT小细节

QT小细节 1 QTextToSpeech1.1 cmake1.2 qmake QT6 6.7.2 1 QTextToSpeech 从下图可以看到&#xff0c;分别使用qmake或者cmake编译情况下的&#xff0c;QTextToSpeech的使用方法 QTextToSpeech官方链接&#xff0c;也可以直接在QT Creator的帮助中搜索 1.1 cmake 将上图中的…

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…

微信小程序新建项目发现导航条不见了,及如何找回。

原因是现在小程序新建用的是 Skyline 渲染引擎 开启全局Skyline渲染引擎&#xff0c;因为Skyline不支持原生导航栏&#xff0c;所以就没显示原生导航栏了。 解决方法也很简单 app.json文件中的 “renderer”: “skyline”, 修改为 “renderer”:“webview”app.json文件中的…

CSS基础学习之元素定位(6)

目录 1、定位类型 2、取值 2.1、static 2.2、relative 2.3、absolute 2.4、fixed 2.5、stickty 3、示例 3.1、相对定位(relative) 3.2、绝对定位&#xff08;absolute&#xff09; 3.3、固定定位&#xff08;fixed&#xff09; 3.4、粘性定位&#xff08;sticky&…