site logo

Keep doing what you want, never give up.

文章配图

Go语言编程性能优化小技巧

虽然 Go 语言是一个高性能的编程语言,但有些情况下我们还是需要关心它的性能优化。 下面便是一些常见的Go性能优化小提示: 字符串处理相关: 使用StringBuffer 或是StringBuild 来拼接字符串,性能会比使用 + 或 +=高三到四个数量级。 如果需要把数字转换成字符串,使用 strconv.Itoa() 比 fmt.Sprintf() 要快一倍左右。 尽可能避免把String转成[]Byte ,这个转换会导致性能下降。 内存分配相关: 如果在 for-loop 里对某个 Slice 使用 append(),请先把 Slice 的容量扩充到位,这样可以避免内存重新分配以及系统自动按 2 的 N 次方幂进行扩展但又用不到的情况,从而避免浪费内存。 GC相关: 避免在热代码中进行内存分配,这样会导致 gc 很忙。尽可能使用 sync.Pool 来重用对象。 锁相关: 使用 lock-free 的操作,避免使用 mutex,尽可能使用 sync/Atomic包。 IO相关: 使用 I/O 缓冲,I/O 是个非常非常慢的操作,使用 bufio.NewWrite() 和 bufio.NewReader() 可以带来更高的性能。 循环相关: 对于在 for-loop 里的固定的正则表达式,一定要使用 regexp.Compile() 编译正则表达式。性能会提升两个数量级。 协议相关: 如果你需要更高性能的协议,可以考虑使用 protobuf 而不是 JSON,因为 JSON 的序列化和反序列化里使用了反射。 字典相关: 你在使用 Map 的时候,使用整型的 key 会比字符串的要快,因为整型比较比字符串比较要快。
文章配图

运行Github上Go包中example示例的正确姿势

日常开发中我们经常会使用到第三方Go包,而很多Go包中默认都包含了一些example示例代码来帮助用户直观的感受产品运行效果,那我们应该怎么运行这些代码呢? 以前都是一股脑儿的git clone整个仓库然后切换到example目录运行相关代码来看效果,除了这种方法外,我们还可以使用Go为我们提供的go list工具链命令来实现同样的效果。 这里以github.com/gorilla/websocket这个Web Socket包为例,官方示例代码如下: 1 go get github.com/gorilla/websocket 2 cd `go list -f '{{.Dir}}' github.com/gorilla/websocket/examples/chat` 3 go run *.go 这里主要解释下第二行代码的含义: # cd反引号(``)表示命令替换,它会先执行反引号中的命令,然后将命令代码的返回结果替换到命令行中 cd `命令代码` # go list命令的作用是列出包的相关信息 go list github.com/gorilla/websocket/examples/chat 给go list加上 -f ‘{{ .Dir }}‘参数是指定了go list的输出格式,这里使用了Go模版语法,’{{ .Dir }}‘表示输出包的目录路径 # go list命令的作用是列出包的相关信息 go list -f '{{ .Dir }}' github.com/gorilla/websocket/examples/chat 所以,这段代码整体的作用就是获取github.com/gorilla/websocket/examples/chat这个Go包的目录里路径,并切换到这个目录下,然后可以直接在改目录下运行相关go代码了。