哇塞 bytes.makeSlice 终于以前十中消散了,真的太棒了,照旧看看 bytes.makeSlice 的其余挪用环境吧。
- (pprof) web bytes.makeSlice

从图中可以发明 bytes.makeSlice 的分派已经很小了, 且大大都是 http.Request.ParseForm 读取 http.Request.Body 行使 ioutil.ReadAll 缘故起因,这次优化的结果很是的好。
看一下更直观的火焰图吧,和优化前比拟一下很明明 ioutil.ReadAll 看不到了。

优化时代碰着的题目
较量忸怩在优化的进程呈现了一个纰谬,导致出产情形2分钟妨碍,通过自动陈设当即回滚才得以快速规复,之后说明代码办理之后上线才美满优化,下面总结一下呈现的题目吧。
在构建 http 哀求时我分了两个部门优化,序列化 json 和读取 http.Response.Body 数据,保持一个概念就是尽早把 buffer 放回到缓冲池,由于 http.DefaultClient.Do(req) 是收集哀求会相对耗时,在这个之前我把 buffer 放回到缓冲池中,之后读取 http.Response.Body 时在从头获取一个 buffer,或许代码如下:
- package adapter
-
- import (
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "sync"
-
- "github.com/json-iterator/go"
- "github.com/sirupsen/logrus"
- "github.com/thinkeridea/go-extend/exbytes"
- )
-
- type Adapter struct {
- pool sync.Pool
- }
-
- func New() *Adapter {
- return &Adapter{
- pool: sync.Pool{
- New: func() interface{} {
- return bytes.NewBuffer(make([]byte, 4096))
- },
- },
- }
- }
-
- func (api *Adapter) Request(r *Request) (*Response, error) {
- var err error
- buffer := api.pool.Get().(*bytes.Buffer)
- buffer.Reset()
- defer func() {
- if buffer != nil {
- api.pool.Put(buffer)
- buffer = nil
- }
- }()
-
- e := jsoniter.NewEncoder(buffer)
- err = e.Encode(r)
- if err != nil {
- return nil, fmt.Errorf("jsoniter.Marshal failure: %v", err)
- }
-
- data := buffer.Bytes()
- req, err := http.NewRequest("POST", "http://xxx.com", buffer)
- if err != nil {
- return nil, fmt.Errorf("http.NewRequest failed: %v", err)
- }
-
- req.Header.Set("User-Agent", "xxx")
-
- api.pool.Put(buffer)
- buffer = nil
-
- httpResponse, err := http.DefaultClient.Do(req)
-
-
- // ....
-
- buffer = api.pool.Get().(*bytes.Buffer)
- buffer.Reset()
- defer func() {
- if buffer != nil {
- api.pool.Put(buffer)
- buffer = nil
- }
- }()
- _, err = io.Copy(buffer, httpResponse.Body)
- if err != nil {
- return nil, fmt.Errorf("adapter io.copy failure error:%v", err)
- }
-
- // ....
-
- api.pool.Put(buffer)
- buffer = nil
-
- // ...
- return res, nil
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|