vmihailenco/bufpool
GitHub: vmihailenco/bufpool
一个 Go 语言字节缓冲区池实现,通过容量分级和使用统计来减少内存分配开销并防止内存浪费。
Stars: 8 | Forks: 3
# bufpool
[](https://travis-ci.org/vmihailenco/bufpool)
[](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分析, 日志审计