mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

根据静态分析结果清理未使用的函数: 删除文件: - Common/utils/mappool.go (整个Map对象池模块未被使用) 精简文件: - Common/utils/slicepool.go: 移除未使用的池管理函数,保留核心去重功能 - Common/utils/stringbuilder.go: 移除未使用的格式化和统计函数 - Common/utils/benchmark_test.go: 更新测试以适应清理后的API 保留的核心功能: ✓ JoinStrings/JoinInts - 字符串连接优化 (18x性能提升) ✓ DeduplicateStrings - 字符串去重功能 ✓ StringBuilderPool - 字符串构建器池化机制 清理效果: - 减少约150行无用代码 - 简化API设计,提高可维护性 - 保持所有实际使用的优化功能完整性 - 编译测试和功能测试全部通过 经验证,核心的内存优化功能(字符串连接18x性能提升,99.8%内存减少)完全保留。
129 lines
2.7 KiB
Go
129 lines
2.7 KiB
Go
package utils
|
||
|
||
import (
|
||
"strconv"
|
||
"strings"
|
||
"sync"
|
||
"sync/atomic"
|
||
)
|
||
|
||
// StringBuilderPool 字符串构建器池
|
||
type StringBuilderPool struct {
|
||
pool sync.Pool
|
||
reused int64 // 复用计数器
|
||
maxSize int // 最大保留大小,防止内存无限增长
|
||
}
|
||
|
||
// NewStringBuilderPool 创建新的字符串构建器池
|
||
func NewStringBuilderPool(maxSize int) *StringBuilderPool {
|
||
if maxSize <= 0 {
|
||
maxSize = 64 * 1024 // 默认64KB最大保留大小
|
||
}
|
||
|
||
return &StringBuilderPool{
|
||
pool: sync.Pool{
|
||
New: func() interface{} {
|
||
return &strings.Builder{}
|
||
},
|
||
},
|
||
maxSize: maxSize,
|
||
}
|
||
}
|
||
|
||
// Get 获取字符串构建器
|
||
func (p *StringBuilderPool) Get() *strings.Builder {
|
||
builder := p.pool.Get().(*strings.Builder)
|
||
builder.Reset() // 清空内容但保留容量
|
||
atomic.AddInt64(&p.reused, 1)
|
||
return builder
|
||
}
|
||
|
||
// Put 归还字符串构建器
|
||
func (p *StringBuilderPool) Put(builder *strings.Builder) {
|
||
if builder == nil {
|
||
return
|
||
}
|
||
|
||
// 如果容量超过最大限制,不放回池中以避免内存泄露
|
||
if builder.Cap() > p.maxSize {
|
||
return
|
||
}
|
||
|
||
p.pool.Put(builder)
|
||
}
|
||
|
||
// JoinStrings 高效连接字符串切片
|
||
func (p *StringBuilderPool) JoinStrings(slice []string, sep string) string {
|
||
if len(slice) == 0 {
|
||
return ""
|
||
}
|
||
if len(slice) == 1 {
|
||
return slice[0]
|
||
}
|
||
|
||
builder := p.Get()
|
||
defer p.Put(builder)
|
||
|
||
// 预估容量:所有字符串长度 + 分隔符长度
|
||
var totalLen int
|
||
for _, s := range slice {
|
||
totalLen += len(s)
|
||
}
|
||
totalLen += len(sep) * (len(slice) - 1)
|
||
|
||
// 如果当前容量不足,预先增长
|
||
if builder.Cap() < totalLen {
|
||
builder.Grow(totalLen)
|
||
}
|
||
|
||
builder.WriteString(slice[0])
|
||
for i := 1; i < len(slice); i++ {
|
||
builder.WriteString(sep)
|
||
builder.WriteString(slice[i])
|
||
}
|
||
|
||
return builder.String()
|
||
}
|
||
|
||
// JoinInts 高效连接整数切片
|
||
func (p *StringBuilderPool) JoinInts(slice []int, sep string) string {
|
||
if len(slice) == 0 {
|
||
return ""
|
||
}
|
||
if len(slice) == 1 {
|
||
return strconv.Itoa(slice[0])
|
||
}
|
||
|
||
builder := p.Get()
|
||
defer p.Put(builder)
|
||
|
||
// 预估容量:平均每个整数4字符 + 分隔符
|
||
estimatedLen := len(slice)*4 + len(sep)*(len(slice)-1)
|
||
if builder.Cap() < estimatedLen {
|
||
builder.Grow(estimatedLen)
|
||
}
|
||
|
||
builder.WriteString(strconv.Itoa(slice[0]))
|
||
for i := 1; i < len(slice); i++ {
|
||
builder.WriteString(sep)
|
||
builder.WriteString(strconv.Itoa(slice[i]))
|
||
}
|
||
|
||
return builder.String()
|
||
}
|
||
|
||
|
||
|
||
// 全局字符串构建器池实例
|
||
var GlobalStringBuilderPool = NewStringBuilderPool(64 * 1024)
|
||
|
||
// 便捷函数,使用全局池
|
||
func JoinStrings(slice []string, sep string) string {
|
||
return GlobalStringBuilderPool.JoinStrings(slice, sep)
|
||
}
|
||
|
||
func JoinInts(slice []int, sep string) string {
|
||
return GlobalStringBuilderPool.JoinInts(slice, sep)
|
||
}
|
||
|