这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
本次课程主要是将GO语言发现版本优化与落地实践 优化,主要是两个方面:内存管理优化和编译器优化
性能优化:提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力。 以达到给用户带来体验的提升,如:刷视频不卡顿,双十一购物不卡顿。
业务层优化:针对特定的场景,具体问题具体分析,容易获得较大收益。 语言运行时优化:解决更通用的性能问题,考虑更多场景。
目前go语言已经发展打了1.18,其期待的GC机制已经比较优秀了,满足绝大部分场景的需求。go语言GC时使用三色标记法来进行垃圾回收的。三色标记法的原理很简单,不可达的即使需要清理回收的。
理解三色标记法的原理很简单,但其实现却不是很容易。 下面以为我查阅资料写的trie数来作为具体场景优化的例子吧。
package main
import "strings"
type node struct {
pattern string //待匹配路由,记录该条路径的具体路由,无则为""
part string //路由中的一部分
children []*node //子节点
isWild bool //是否模糊匹配
}
//加入了isWild字段,当/p/go/doc这个路由时,第一层比配到了/p,第二层模糊匹配到了/:lang,、
//将会把isWild这个字段设置为true,并把lang赋值为go,再继续匹配
//匹配单层路由
func (n *node) matchChild(part string) *node {
for _, child := range n.children {
if child.part == part || child.isWild {
return child
}
}
return nil
}
//所有匹配成功的节点
func (n *node) matchChildren(part string) []*node {
nodes := make([]*node, 0)
for _, child := range n.children {
if child.part == part || child.isWild {
nodes = append(nodes, child)
}
}
return nodes
}
//插入一条路由信息
func (n *node) insert(pattern string, parts []string, depth int) {
if len(parts) == depth {
n.pattern = pattern
return
}
part := parts[depth]
child := n.matchChild(part)
if child == nil {
child = &node{
part: part,
isWild: part[0] == ':' || part[0] == '*',
}
n.children = append(n.children, child)
}
child.insert(pattern, parts, depth+1)
}
//查找某条路由路径是否存在
func (n *node) serch(parts []string, depth int) *node {
if len(parts) == depth || strings.HasSuffix(n.part, "*") {
if n.part == "" {
return nil
}
return n
}
part := parts[depth]
children := n.matchChild(part)
for _, child := range children {
result := child.serch(parts, depth+1)
if result != nil {
return result
}
}
return nil
}
标题:青训营社区