bfs:对FileHeader的压缩和解压使用Pool管理

This commit is contained in:
刘祥超
2024-04-28 10:06:29 +08:00
parent 962cbde4e9
commit b272de2122
8 changed files with 470 additions and 65 deletions

View File

@@ -0,0 +1,66 @@
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package bfs
import (
"github.com/TeaOSLab/EdgeNode/internal/utils/percpu"
"github.com/klauspost/compress/gzip"
"io"
"runtime"
)
var SharedDecompressPool = NewGzipReaderPool()
type GzipReaderPool struct {
c chan *gzip.Reader
cList []chan *gzip.Reader
}
func NewGzipReaderPool() *GzipReaderPool {
const poolSize = 16
var countProcs = runtime.GOMAXPROCS(0)
if countProcs <= 0 {
countProcs = runtime.NumCPU()
}
countProcs *= 4
var cList []chan *gzip.Reader
for i := 0; i < countProcs; i++ {
cList = append(cList, make(chan *gzip.Reader, poolSize))
}
return &GzipReaderPool{
c: make(chan *gzip.Reader, poolSize),
cList: cList,
}
}
func (this *GzipReaderPool) Get(rawReader io.Reader) (*gzip.Reader, error) {
select {
case w := <-this.getC():
err := w.Reset(rawReader)
if err != nil {
return nil, err
}
return w, nil
default:
return gzip.NewReader(rawReader)
}
}
func (this *GzipReaderPool) Put(reader *gzip.Reader) {
select {
case this.getC() <- reader:
default:
// 不需要close因为已经在使用的时候调用了
}
}
func (this *GzipReaderPool) getC() chan *gzip.Reader {
var procId = percpu.GetProcId()
if procId < len(this.cList) {
return this.cList[procId]
}
return this.c
}