package queue_test import ( "context" "sync" "testing" "time" "git.belvedersky.ru/belvedersky/queue" ) type benchTask struct { ID int } // BenchmarkProduceConsume измеряет производительность очереди // при различном количестве воркеров. func BenchmarkProduceConsume(b *testing.B) { benchmarks := []struct { name string workers int }{ {"workers_1", 1}, {"workers_4", 4}, {"workers_16", 16}, } for _, bm := range benchmarks { b.Run(bm.name, func(b *testing.B) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() q := queue.NewQueue[benchTask](10) var wg sync.WaitGroup wg.Add(b.N) q.Register(func(t benchTask) { time.Sleep(100 * time.Microsecond) // имитация нагрузки wg.Done() }) q.HandleParallel(ctx, bm.workers) b.ResetTimer() for i := 0; i < b.N; i++ { q.Produce(benchTask{ID: i}) } wg.Wait() q.Shutdown(context.Background()) }) } } // BenchmarkTryProduce тестирует неблокирующую постановку задач. func BenchmarkTryProduce(b *testing.B) { ctx := context.Background() q := queue.NewQueue[benchTask](10) q.HandleParallel(ctx, 4) defer q.Close() task := benchTask{} b.ResetTimer() for i := 0; i < b.N; i++ { q.TryProduce(task, 5*time.Millisecond) } }