性能
- 不要省略
defer
- 在大多数情况下 200ns 加速可以忽略不计
- 总是关闭 http body
defer r.Body.Close()
- 除非你需要泄露 goroutine
- 过滤但不分配新内存
b := a[:0]
for _, x := range a {
if f(x) {
b = append(b, x)
}
}
为了帮助编译器删除绑定检查,请参见此模式 _ = b [7]
time.Time
有指针字段time.Location
并且这对 go GC 不好- 只有使用了大量的
time.Time
才(对性能)有意义,否则用 timestamp 代替
- 只有使用了大量的
regexp.MustCompile
比regexp.Compile
更好- 在大多数情况下,你的正则表达式是不可变的,所以你最好在
func init
中初始化它
- 在大多数情况下,你的正则表达式是不可变的,所以你最好在
- 请勿在你的热点代码中过度使用
fmt.Sprintf
. 由于维护接口的缓冲池和动态调度,它是很昂贵的。- 如果你正在使用
fmt.Sprintf("%s%s", var1, var2)
, 考虑使用简单的字符串连接。 - 如果你正在使用
fmt.Sprintf("%x", var)
, 考虑使用hex.EncodeToString
orstrconv.FormatInt(var, 16)
- 如果你正在使用
- 如果你不需要用它,可以考虑丢弃它,例如
io.Copy(ioutil.Discard, resp.Body)
- HTTP 客户端的传输不会重用连接,直到body被读完和关闭。
res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
defer res.Body.Close()
- 不要在循环中使用 defer,否则会导致内存泄露
- 因为这些 defer 会不断地填满你的栈(内存)
- 不要忘记停止 ticker, 除非你需要泄露 channel
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
- 用自定义的 marshaler 去加速 marshaler 过程
- 但是在使用它之前要进行定制!例如:https://play.golang.org/p/SEm9Hvsi0r
func (entry Entry) MarshalJSON() ([]byte, error) {
buffer := bytes.NewBufferString("{")
first := true
for key, value := range entry {
jsonValue, err := json.Marshal(value)
if err != nil {
return nil, err
}
if !first {
buffer.WriteString(",")
}
first = false
buffer.WriteString(key + ":" + string(jsonValue))
}
buffer.WriteString("}")
return buffer.Bytes(), nil
}
sync.Map
不是万能的,没有很强的理由就不要使用它。在
sync.Pool
中分配内存存储非指针数据为了隐藏逃生分析的指针,你可以小心使用这个函数::
// noescape hides a pointer from escape analysis. noescape is
// the identity function but escape analysis doesn't think the
// output depends on the input. noescape is inlined and currently
// compiles down to zero instructions.
//go:nosplit
func noescape(p unsafe.Pointer) unsafe.Pointer {
x := uintptr(p)
return unsafe.Pointer(x ^ 0)
}
- 对于最快的原子交换,你可以使用这个
m := (*map[int]int)(atomic.LoadPointer(&ptr))
如果执行许多顺序读取或写入操作,请使用缓冲 I/O
- 减少系统调用次数
有 2 种方法清空一个 map:
- 重用 map 内存 (但是也要注意 m 的回收)
for k := range m {
delete(m, k)
}
- 分配新的
m = make(map[int]int)
当前内容版权归 cristaloleg 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 cristaloleg .