vmihailenco/bufpool

GitHub: vmihailenco/bufpool

一个 Go 语言字节缓冲区池实现,通过容量分级和使用统计来减少内存分配开销并防止内存浪费。

Stars: 8 | Forks: 3

# bufpool [![Build Status](https://travis-ci.org/vmihailenco/bufpool.svg)](https://travis-ci.org/vmihailenco/bufpool) [![GoDoc](https://godoc.org/github.com/vmihailenco/bufpool?status.svg)](https://godoc.org/github.com/vmihailenco/bufpool) bufpool 是一个字节缓冲区池的实现,带有防止内存浪费的保护机制。它基于以下 2 个项目的代码和思想: - https://github.com/libp2p/go-buffer-pool - https://github.com/valyala/bytebufferpool bufpool 由一个全局缓冲区池组成,该池中缓冲区的容量为 2 的幂次方,范围从 64 字节到 32 MB。它还提供了独立的池,这些池会维护使用统计信息,以提供能满足 95% 调用所需大小的缓冲区。全局池用于在应用程序的不同部分之间重用缓冲区。 # 安装 ``` go get github.com/vmihailenco/bufpool ``` # 用法 bufpool 可以用作 `sync.Pool` 的替代品: ``` var jsonPool bufpool.Pool // basically sync.Pool with usage stats func writeJSON(w io.Writer, obj interface{}) error { buf := jsonPool.Get() defer jsonPool.Put(buf) if err := json.NewEncoder(buf).Encode(obj); err != nil { return err } _, err := w.Write(buf.Bytes()) return err } ``` 或者用于分配指定大小的缓冲区: ``` func writeHex(w io.Writer, data []byte) error { n := hex.EncodedLen(len(data))) buf := bufpool.Get(n) // buf.Len() is guaranteed to equal n defer bufpool.Put(buf) tmp := buf.Bytes() hex.Encode(tmp, data) _, err := w.Write(tmp) return err } ``` 如果你需要将数据追加到缓冲区,你可以使用以下模式: ``` buf := bufpool.Get(n) defer bufpool.Put(buf) bb := buf.Bytes()[:0] bb = append(bb, ...) buf.ResetBuf(bb) ``` 你也可以更改默认的池阈值: ``` var jsonPool = bufpool.Pool{ ServePctile: 0.95, // serve p95 buffers } ```
标签:EVTX分析, 日志审计