版本优化与落地实践| 青训营笔记

81 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

本次课程主要是将GO语言发现版本优化与落地实践 优化,主要是两个方面:内存管理优化和编译器优化

性能优化:提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力。 以达到给用户带来体验的提升,如:刷视频不卡顿,双十一购物不卡顿。

业务层优化:针对特定的场景,具体问题具体分析,容易获得较大收益。 语言运行时优化:解决更通用的性能问题,考虑更多场景。

目前go语言已经发展打了1.18,其期待的GC机制已经比较优秀了,满足绝大部分场景的需求。go语言GC时使用三色标记法来进行垃圾回收的。三色标记法的原理很简单,不可达的即使需要清理回收的。

image.png

理解三色标记法的原理很简单,但其实现却不是很容易。 下面以为我查阅资料写的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
}

标题:青训营社区

网址:forum.juejin.cn/youthcamp/c…