当前位置: 首页 > news >正文

241118学习日志——[CSDIY] [ByteDance] 后端训练营 [06]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!!
第一弹:Cpp零基础学习【30 DAYS 从0到1】
第二弹:Cpp刷题文档【LeetCode】
第三弹:Go开发入门【字节后端青训营】
第四弹:Cpp简单项目开发【黑马Rookie】
第五弹:数据结构绪论【数据结构与算法】
第六弹:Go工程实践【字节后端青训营】
第七弹:高质量编程和性能调优【字节后端青训营】

241118——[ByteDance] [02] 高质量编程与性能调优实践

实际开发中,不仅仅需要实现功能,也要让团队其他人看懂。

  • 优秀的功能和效率
  • 清晰的算法思路和编程习惯

1. 高质量编程

正确可靠,清晰简介的代码是受欢迎的

1.1 高质量编程简介

  • 各种边界条件是否考虑完备
  • 异常情况处理,稳定性保证
  • 易读易维护

Go:编程原则 - Go 语言开发者 Dave Cheney

  • 简单性:消除多余的“复杂性”,人无法理解的代码无法修复改进
  • 可读性:代码是写给人看的
  • 生产力:团队整体工作效率很重要

1.2 编码规范

如何编写高质量的 Go 代码

  • 代码格式
  • 注释
  • 命名规范
  • 控制流程
  • 错误和异常处理
1.2.1 代码格式

推荐使用 gofmt 自动格式化代码

gofmt / goimports (对依赖包进行增删排序)

某些 IDE 自带格式化功能

1.2.2 注释

Good code has lots of comments, bad code requires lots of comments.

——Dave Thomas and Andrew Hunt

公共符号

一些常量,公开变量

公共符号始终要注释

但有一个例外:不需要注释实现接口的方法。具体不要让开发者去溯源?

实现过程

代码是怎么实现的,在维护代码时也要维护注释

实现原因

提供适合的上下文

限制条件

解释代码在什么情况下会出错

小结

  • 代码是最好的注释
  • 注释应该提供代码未表达出的上下文信息 而不是逐句逐语法解释
1.2.3 命名规范

variab

  • 简介胜于冗长
  • 缩略词全大写
  • 变量距离被使用的地方越远,越需要携带更多的上下文信息

function

  • 函数名不携带包名的上下文信息
  • 函数名尽量简短
  • 函数名可以在不影响歧义的情况下,可以在函数名加入类型信息

package

  • 只由小写字母组成
  • 简短且携带一定信息
  • 不要与标准库同名

尽量满足

  • 不使用常用变量名作为包名
  • 使用单数而不是复数
  • 谨慎使用缩写( format > fmt )

小结

  • 核心目标是降低阅读理解代码的成本
  • 重点考虑上下文信息,设计简介清晰的名称
1.2.4 控制流程
  • 避免 if - else 分支嵌套

  • 尽量保持正常代码路径为最小缩进

小结

  • 线性原理
  • 故障问题大多都出现在复杂的条件语句中
1.2.5 错误和异常处理

简单错误:仅出现一次的错误

复杂错误

错误的 Wrap 和 Unwrap

错误判定

判断一个错误是否为特定错误

在错误链上获取特定种类的错误

panic

  • 不建议在业务代码中使用 panic
  • 若问题可以被屏蔽或解决,建议使用 error 代替 panic
  • 当程序启动阶段发生不可逆转的错误时,可以在 main 函数中使用 panic

recover

  • recover 可以用来解决 panic 引发的进一步错误

  • recover 只能被 defer 函数中使用

  • 在 recover 后在 log 中记录当前调用栈

小结

  • error 尽可能提供简明的上下文信息连,方便定位问题
  • panic 用于真正异常的情况
  • recover 生效范围:在当前 goroutine 的被 defer 的函数中生效

1.3 性能优化建议

性能优化的前提是满足正确可靠、简介清晰

1.3.1 Benchmark

Go 自带的工具

go test -bench=. -benchmen
1.3.2 Slice

预分配内存(避免频繁扩容)

1.3.3 Map

预分配内存

提前分配好内存可以减少内存和 rehash 的消耗

1.3.4 字符串处理

string.Builder : 转化为字符串时 重新申请了一块空间

实际上也是预分配的逻辑

1.3.5 空结构体

空结构体节省内存

  • 节省资源
  • 不需要任何值,仅仅做占位符

可以用来实现 Set,此时只需要键,而不需要值

1.3.6 atomic 包
  • 锁的实现通过操作系统实现,属于系统调用
  • 通过硬件实现

小结

  • 避免常见性能陷阱
  • 普通应用代码,不要一味追求i性能
  • 越高级的性能手段越容易出问题

2. 性能调优实战

学校里学不到的!

2.1 性能调优简介

  • 要依靠数据而不是猜测
  • 要定位最大瓶颈而不是细枝末节
  • 不要过早优化
  • 不要过度优化

2.2 性能分析工具 pprof 实战

说明

  • 希望知道在什么地方耗费了多少CPU、Memory
  • 可视化分析

开始之前:请查看完整教程:

https://blog.wolfogre.com/posts/go-ppof-practice/

如果要说在 golang 开发过程进行性能调优,pprof 一定是一个大杀器般的工具。但在网上找到的教程都偏向简略,难寻真的能应用于实战的教程。这也无可厚非,毕竟 pprof 是当程序占用资源异常时才需要启用的工具,而我相信大家的编码水平和排场问题的能力是足够高的,一般不会写出性能极度堪忧的程序,且即使发现有一些资源异常占用,也会通过排查代码快速定位,这也导致 pprof 需要上战场的机会少之又少。即使大家有心想学习使用 pprof,却也常常相忘于江湖。

既然如此,那我就送大家一个性能极度堪忧的“炸弹”程序吧!

这程序没啥正经用途缺极度占用资源,基本覆盖了常见的性能问题。本文就是希望读者能一步一步按照提示,使用 pprof 定位这个程序的的性能瓶颈所在,借此学习 pprof 工具的使用方法。

因此,本文是一场“实验课”而非“理论课”,请读者腾出时间,脚踏实地,一步一步随实验步骤进行操作,这会是一个很有趣的冒险,不会很无聊,希望你能喜欢。

2.2.1 功能简介
  • Tool工具
  • Sample采样:CPU、Heap、Goroutine
  • Profile分析:网页
  • View展示:Top、Graph、FlameGraph、Source

搭建 pprof 项目

2.2.2 排查实战

保持程序运行,打开浏览器访问 http://localhost:6060/debug/pprof/

可以查看指标:数据平铺

查看 CPU 情况:

查看占用资源最多的函数

命令:top

flatflat%sum%cumcum%
当前函数本身执行耗时flat占 CPU 总时间的比例上面每一行的 flat% 总和当前函数本身加上其调用函数的总耗时cum 占CPU 总时间的比例

Flat == Cum,函数中没有调用其他函数

Flat == 0,函数中只有其他函数的调用

命令:list

根据指定正则表达式查找代码行

命令:web

生成一个调用关系图,使得调用关系可视化


heap-堆内存

goroutine-协程

  • goroutine 泄露会导致内存泄漏

mutex-锁

block-阻塞

2.2.3 采样过程和原理

CPU

  • 采样对象:函数调用和它们占用的时间
  • 采样率:100次/秒,固定值
  • 采样时间:从手动启动到手动结束
  • 操作系统
  • 进程
  • 写缓冲

Heap - 堆内存

  • 采样率:每分配512KB记录一次
  • 采样时间:从程序运行开始到采样时

Goroutine - 协程 & ThreadCreate - 线程创建

  • Goroutine - 协程:记录所有用户发起且在运行中的 Goroutine
  • ThreadCreate - 线程创建:记录程序创建所有系统线程的信息

Bolck - 阻塞 & Mutex - 锁

  • 阻塞操作:采样阻塞操作的次数和耗时
  • 锁竞争:采样争抢锁的次数和耗时

2.3 性能调优案例

  • 实际业务服务性能调优案例

  • 对逻辑相对复杂的程序如何进行性能调优

2.3.1 业务服务优化

基本概念

  • 服务:能单独部署,承载一定功能的程序
  • 依赖:
  • 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
  • 基础库:公共的工具包

流程

  • 建立服务性能评估手段
  • 分析性能数据,定位性能瓶颈
  • 重点优化项改造
  • 优化效果验证

建立服务性能评估手段

  • 服务性能评估方式
  • 请求流量构造
  • 压测范围
  • 性能数据采集

分析性能数据,定位性能瓶颈

  • 使用库不规范
  • 高并发场景优化不足

重点优化项改造

  • 正确性
  • 响应数据

优化效果验证

  • 重复压测验证
  • 上限评估优化结果

进一步优化,服务整体链路分析

  • 规范上游服务调用接口
  • 分析链路
2.3.2 基础库优化

AB 实验 SDK 优化

  • 分析基础库核心逻辑
  • 内部压测验证
  • 推广业务服务落地验证
2.3.3 Go 语言优化

编译器 & 运行时优化

  • 优化内存分配策略
  • 优化代码编译流程
  • 内部压测验证
  • 推广业务服务落地验证

2.4 总结

  • 性能调优原则
    • 要依靠数据而不是猜测
  • 性能调优工具 pprof
    • 熟练使用 pprof 工具排查性能问题并了解其基本原理
  • 性能调优
    • 保证正确性
    • 定位主要瓶颈

碎碎念:每周一可以说是最怕的日子,有很多DDL,但还是挺过来了。跟上字节的课可以说有点困难。。。很多时候都想放弃,但是后端入门篇就这样被我水过去了…谁知道呢,后面的课程会更加虐,但我一想到CSDIY里面的话,我就心有余甘…很多时也想过放弃和偷懒,也想过自己是不是在假努力,但谁说学了一定要会呢?我就是喜欢做笔记的感觉,我就是喜欢敲键盘(打字)怎么了???所以呢,还是不想给自己借口。

与君共勉。

相关文章:

241118学习日志——[CSDIY] [ByteDance] 后端训练营 [06]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

Android WMS概览

WMS(WindowManagerService)是 Android 系统的核心服务,负责管理应用和系统的窗口,包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染&a…...

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 🚀 更简单 👌 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/...

友元类和友元函数

友元函数的定义: 友元函数是在类定义中被声明为 “朋友” 的非成员函数。它可以访问类的私有成员和保护成员(变量和方法),就好像它是类的成员函数一样。友元函数的声明以friend关键字开头,在类的内部进行声明,但它的定义在类的外部&#xff…...

Sulfo-Cy5-Iodoacetamide能够发出明亮的荧光信号,使得生物样本的精细结构得以清晰呈现

一、基本信息 英文名称:Sulfo-Cy5-Iodoacetamide,Sulfo-Cyanine5-Iodoacetamide,Sulfo Cy5 IA 中文名称:磺酸Cy5碘乙酰胺 分子式:C36H44IKN4O8S2 分子量:890.89 纯度:≥95% 外观&#xff…...

Python中的TCP

文章目录 一. 计算机网络1. 网络的概念2. IP地址① IP地址的概念② IP地址的表现形式③ IP地址的作用④ 网络查询命令Ⅰ. ifconfig/ipconfigⅡ. ping 3. 端口和端口号的概念(计算机通信原理)① 端口的概念② 端口号的概念 4. socket套接字① socket概念② socket使用场景 二. T…...

CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用

一.精灵图 通过css中的background-position属性,将多张图合成为一张图 二.css三角 在网页中,我们可以添加css属性获得三角图标 solid:实心,边框的实心 transparent:透明,图中代码表示只有左边粉色,其余地方为透明 三&#xff…...

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…...

SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力

SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…...

一次失败的wxpython安装macOS M1

WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景:想在macos安装Robot Framework ,显示pip3不是最新,更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…...

【大数据技术基础 | 实验十一】Hive实验:新建Hive表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动Hive(二)创建表(三)显示表(四)显示表列(五)更改表(六&am…...

【yarn】yarn rest api每日job数量分析

一、说明 # 无法制定时间范围!!! yarn application -list 官方文档 rest返回内容(官网案例): {app":{"id":"application_1324057493980_0001","user":"user1&q…...

蓝桥杯单片机第十一届省赛(第一场)

主函数代码 #include<iic.h> #include<intrins.h>sfr P40xc0; sbit R3P3^2; sbit R4P3^3; sbit C4P3^4; sbit C3P3^5;unsigned char code led_nodot[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code led_dot[]{0x40,0x79,0x24,0x30,0x…...

hive复杂数据类型Array Map Struct 炸裂函数explode

1、Array的使用 create table tableName( ...... colName array<基本类型> ...... ) 说明&#xff1a;下标从0开始&#xff0c;越界不报错&#xff0c;以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表&#xff1a; create table arr1(n…...

FIFO架构专题-FIFO是什么

目录 简介&#xff1a; FIFO参数&#xff1a; 1.宽度WIDTH&#xff08;一次位数&#xff09; 2.深度DEEPTH&#xff08;存多少次&#xff09; FIFO的分类&#xff1a; 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...

Pythony——多线程简单爬虫实现

简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表&#xff0c;这里是博客园的分页地址&#xff0c;从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...

如何修改 a 链接的样式

在CSS中&#xff0c;你可以使用选择器来针对HTML中的特定元素&#xff08;例如<a>标签&#xff0c;也就是链接&#xff09;进行修改样式。以下是一些常见的修改<a>链接样式的方法&#xff1a; 移除下划线&#xff1a; a { text-decoration: none; } 修改链接的…...

第6章 详细设计-6.5 软硬件接口文档设计

6.5 软硬件接口文档设计 一般的产品都包含硬件和软件两部分&#xff0c;产品设计阶段需要确保硬件开发人员和软件开发的沟通准确、高效。所以需要一份书面的文档来承载软件和硬件之间的沟通细节。以下面的细水雾除尘设备为例进行讲解&#xff0c;涉及软件和硬件的接口&#xff…...

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…...

C++全局构造和初始化

片段摘自程序员的自我修养—链接、装载与库.pdf 11.4 程序在进入main之前&#xff0c;需要对全局对象进行构造初始化。 glibc全局对象进行构造初始化 gibc启动程序时会经过.init段&#xff0c;退出程序时会经过.finit段。这两个段中的代码最终拼接成_init()和_finit(),这两个…...

安全见闻-泷羽sec课程笔记

编程语言 C语言&#xff1a;一种通用的、面向过程的编程语言&#xff0c;广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来&#xff0c;支持面向对象编程&#xff0c;常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言&#xff0c;具有跨平台…...

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …...

【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )

文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...

【学习笔记】量化概述

Quantize量化概念与技术细节 题外话&#xff0c;在七八年前&#xff0c;一些关于表征的研究&#xff0c;会去做表征的压缩&#xff0c;比如二进制嵌入这种事情&#xff0c;其实做得很简单&#xff0c;无非是找个阈值&#xff0c;然后将浮点数划归为零一值&#xff0c;现在的Qu…...

同步互斥相关习题10道 附详解

PV操作 2016 某系统允许最多10个进程同时读文件F&#xff0c;当同时读文件F的进程不满10个时&#xff0c;欲读该文件的其他文件可立即读&#xff0c;当已有10个进程在读文件F时读&#xff0c;其他欲读文件F的进程必须等待&#xff0c;直至有进程读完后退出方可去读 在实现管…...

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...

Git 拉取指定分支创建项目

一 背景 因为项目过大&#xff0c;只需要部分分支的代码即可。 二 实现 方法一&#xff1a;使用 --single-branch 参数 git clone 支持只拉取指定分支&#xff0c;而不是整个库的所有分支&#xff1a; git clone --branch <branch_name> --single-branch <reposi…...

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)

思路&#xff1a;一个二分图是由两个集合组成的&#xff0c;同一个集合中的节点间不能连边&#xff0c;所以一个二分图最多有cnt[1]*cnt[2]条边&#xff0c;题目给出一个树的n-1条边&#xff0c;要我们添加最多的边数使他成为二分图&#xff0c;添加的边数就是cnt[1]*cnt[2]-n1…...

React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础

在 React Native 应用中&#xff0c;数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理&#xff0c;包括 React Hooks、Context API 以及第三方状态管理库&#xff08;如 Redux&#xff09;。本章节将详细介绍 React Hooks 的基础…...

传奇996_22——自动挂机

登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...

网站建设销售年终总结/电商网站设计方案

// 1. 不需要参数,返回值为 5() -> 5// 2. 接收一个参数(数字类型),返回其2倍的值x -> 2 * x// 3. 接受2个参数(数字),并返回他们的差值(x, y) -> x – y// 4. 接收2个int型整数,返回他们的和(int x, int y) -> x y// 5. 接受一个 string 对象,并在控制台打印,不返…...

凡科建站联系电话/青青河边草直播免费观看

MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock&#xff0c;所以只有「明确」的指定主键&#xff0c;MySQL才会执行Row lock (只锁住被选取的资料例) &#xff0c;否则MySQL将会执行Table Lock (将整个资料表单给锁住)。 举个例子: 假设有个表单product…...

怎么做能让网站收录的快/搜索引擎营销实训报告

1.今年又遇到些事&#xff0c;很纠结&#xff0c;又修练了一次&#xff1b;2.又颓废了段时间&#xff0c;该收收心认真做点事情了&#xff1b;3.最近看书的时间少了&#xff0c;得好好静下心来多看点书&#xff1b;4.性格还是那么地急、快&#xff0c;对于做事有利也有弊&#…...

网站开发必须要做前端吗/整合营销方案怎么写

管了一段时间论坛&#xff0c;了解到网民对流氓软件有着切肤之痛&#xff0c;不少网友尝试用各种办法来尝试清除流氓软件。结果却发现流氓软件和病毒软件相比&#xff0c;流氓软件更难清除。这其中有一个深刻的原因&#xff0c;病毒通常是个人或小工作室制作&#xff0c;而流氓…...

做网站设计制作的/google网页版

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供…...

网站流程图制作软件/友情链接分析

单一继承树原则&#xff1a; 为什么这么重载new之后&#xff0c;SmartPointer<int>* sp new SmartPointer<int>();这行代码执行的是重载的new&#xff1f;一是因为Object是所有类的基类 SmartPointer<int>* sp new SmartPointer<int>(); //Smart…...