这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
程序由上而下有这些层次:业务代码,SDK,基础库,语言运行时,OS 性能优化的两个角度
- 业务层优化 :针对特定场景,具体问题具体分析,容易获得较大性能收益
- 语言运行时优化:解决更通用的性能问题,tradeoff
Go SDK
确保Go SDK软件质量,可维护性的手段:
- 保证接口稳定的前提下改进具体实现
- 测试用例:覆盖尽可能多的场景
- 写好说明文档
- 隔离:通过选项控制是否开启优化
- 可观测:必要的日志输出,使用者可以看到运行情况
01 自动内存管理
- 动态内存:程序在运行时根据需求动态分配的内存: malloc()
- 自动内存管理:由程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内存使用的正确性和安全性: double-free problem, use-after-free problem
-
三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
作者:青训营官方账号
链接:juejin.cn/post/709597…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
collectors 需要感知对象指向关系的改变,从而正确标记所有存活的对象。
02 Go内存管理及优化
03 编译器和静态分析
04 Go 编译器优化
设计模式之 Database/SQL 与 GORM 实践
理解 database/sql
基本用法
import (
"database/sql"//这个包里有连接池,一些接口用于连接数据库和操作数据库
_"github.com/go-sql-driver/mysql"
)
func main(){
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
rows, err := db.Query("select id, name from users where id = ?", 1)
if err != nil{
//xxx
}
defer row.Close()
var users []User
for rows.Next(){
vae user User
err := rows.Scan(&user.ID, &user.Name)
if errr != nil{
// ...
}
users = append(users, user)
}
if rows.Err() != nil{
//...
}
//早年的用法:注册Driver,是一个连接接口
func init(){
sql.Register("mysql", &MySQLDriver{})
}
}
新的接口Connector,传入一个interface,返回一个db
用法:
GORM 使用简介
GORM 是什么?一种简洁,强大的ORM(ORM 是用元数据描述对象与关系映射的细节的框架,轮子)。 基本用法:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
func main(){
db, err := gorm.Open(
mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
)
var users []User
err = db.Select("id","name").Find(&users, 1).Error
}
GORM 设计原理
ConnPool
Dialector