Files
go-pixelnebula/benchmark/concurrency_memory_benchmark_test.go
2025-03-19 21:10:19 +08:00

139 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package benchmark
import (
"sync"
"testing"
"github.com/landaiqing/go-pixelnebula"
"github.com/landaiqing/go-pixelnebula/style"
)
// BenchmarkConcurrentGeneration 测试并发生成头像的性能
func BenchmarkConcurrentGeneration(b *testing.B) {
concurrencyCounts := []int{1, 2, 4, 8, 16}
for _, count := range concurrencyCounts {
b.Run("Concurrent_"+Itoa(count), func(b *testing.B) {
b.ResetTimer()
// 将总迭代次数调整为b.N确保可比较性
b.SetParallelism(count)
b.RunParallel(func(pb *testing.PB) {
counter := 0
for pb.Next() {
counter++
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(231, 231)
pn.WithDefaultCache()
_, err := pn.Generate("benchmark-concurrent-"+Itoa(counter), false).ToSVG()
if err != nil {
b.Fatal(err)
}
}
})
})
}
}
// BenchmarkConcurrentWithSharedInstance 测试使用共享实例进行并发生成的性能
func BenchmarkConcurrentWithSharedInstance(b *testing.B) {
concurrencyCounts := []int{1, 2, 4, 8, 16}
for _, count := range concurrencyCounts {
b.Run("SharedInstance_"+Itoa(count), func(b *testing.B) {
// 创建一个共享实例
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(231, 231)
pn.WithDefaultCache()
// 创建互斥锁保护共享实例
var mu sync.Mutex
b.ResetTimer()
b.SetParallelism(count)
b.RunParallel(func(pb *testing.PB) {
counter := 0
for pb.Next() {
counter++
// 锁定共享实例
mu.Lock()
_, err := pn.Generate("benchmark-shared-"+Itoa(counter), false).ToSVG()
mu.Unlock()
if err != nil {
b.Fatal(err)
}
}
})
})
}
}
// BenchmarkMemoryUsage 测试不同操作的内存使用情况
func BenchmarkMemoryUsage(b *testing.B) {
// 注意: 这个基准测试主要关注内存分配统计,
// Go 的基准测试框架会自动收集并报告内存统计数据
// 测试基本头像生成的内存使用
b.Run("BasicGeneration", func(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(231, 231)
_, err := pn.Generate("memory-basic", false).ToSVG()
if err != nil {
b.Fatal(err)
}
}
})
// 测试添加动画的内存使用
b.Run("WithAnimations", func(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(231, 231)
pn.WithRotateAnimation("env", 0, 360, 10, 1)
pn.WithFadeAnimation("eyes", "1", "0.3", 2, 1)
_, err := pn.Generate("memory-animations", false).ToSVG()
if err != nil {
b.Fatal(err)
}
}
})
// 测试缓存的内存使用
b.Run("WithCache", func(b *testing.B) {
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(231, 231)
pn.WithDefaultCache()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := pn.Generate("memory-cache", false).ToSVG()
if err != nil {
b.Fatal(err)
}
}
})
// 测试大尺寸头像的内存使用
b.Run("LargeSize", func(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
pn := pixelnebula.NewPixelNebula()
pn.WithStyle(style.GirlStyle)
pn.WithSize(1000, 1000)
_, err := pn.Generate("memory-large", false).ToSVG()
if err != nil {
b.Fatal(err)
}
}
})
}