Go中为什么要尽量使用标准库的代码
使用标准库的好处
1.无需自己编写逻辑,重复造轮子
2.标准实现,大部分场景适合
3.无需重新考虑代码性能
为什么说无需重新考虑代码性能问题,我们简单的看一下以下案例代码
1 package main 2 import ( 3 "fmt" 4 ) 5 6 func main(){ 7 s, sep:= "", " " 8 // 第一种方式拼接字符 9 for _, arg:= os.Args[1:]{ 10 s+=sep+arg 11 } 12 fmt.Println(s) 13 }
package main import ( "fmt" ) func main(){ // 使用官方标准库的方式 fmt.Println(strings.Join(os.Args[1:], " ")) }
除了语句更加简单外,我们看一下strings.Join的标准库中Join方法的实现
// Join concatenates the elements of its first argument to create a single string. The separator // string sep is placed between elements in the resulting string.
//把列表的元素合并,中间以分隔符分隔,作为一个字符串
func Join(elems []string, sep string) string {
//先判断列表长度做性能检测优化 switch len(elems) { case 0: return "" case 1: return elems[0] }
//预计sep所占用空间的整个长度 n := len(sep) * (len(elems) - 1) for i := 0; i < len(elems); i++ { n += len(elems[i]) } var b Builder
//一次分配内存空间,无需反复分配和释放 b.Grow(n) b.WriteString(elems[0]) for _, s := range elems[1:] { b.WriteString(sep) b.WriteString(s) } return b.String() }
使用标准库,节约了内存空间和时间。strings.Join是一次性分配内存空间,不需要反复分配和释放内存。内存分配过程中可能会发生内存页大小不够,导致缺页的情况。
缺页 - 指的是当软件试图访问已映射在虚拟地址空间中,但是并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。这时候操作系统会尝试将相关的分页从硬盘上的虚拟内存文件中调入内存。而如果访问是不被允许的,那么操作系统通常会结束相关的进程。从硬盘上虚拟内存页读取文件是比较耗时的一个过程,所以当出现缺页时,耗时会大大的增加。
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。brk是将数据段(.data)的最高地址指针_edata往高地址推,mmap是在进程的虚拟地址空间中(一般是堆和栈中间)找一块空闲的。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
所以分配内存时尽可能一次性分配足够用的空间,防止频繁修改分配。
简单的性能指标:
majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:
1.检查要访问的虚拟地址是否合法
2.查找/分配一个物理页
3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
4.建立映射关系(虚拟地址到物理地址)
5.重新执行发生缺页中断的那条指令
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
如果进程minflt很高,就很有可能是因为它跟进程内核态cpu消耗大有很大关系。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!