给 GPT 的 Prompts

avatar User

gopool.go package gopool

type Task func()

type GoPool struct { TaskQueue chan Task MaxWorkers int Workers []*Worker }

func NewGoPool(maxWorkers int) *GoPool { pool := &GoPool{ TaskQueue: make(chan Task), MaxWorkers: maxWorkers, Workers: make([]*Worker, maxWorkers), } for i := 0; i < maxWorkers; i++ { worker := newWorker(pool.TaskQueue) pool.Workers[i] = worker worker.start() } return pool }

func (p *GoPool) AddTask(task Task) { p.TaskQueue <- task }

func (p *GoPool) Release() { close(p.TaskQueue) for _, worker := range p.Workers { <-worker.TaskQueue } }

worker.go package gopool

type Worker struct { TaskQueue chan Task }

func newWorker(taskQueue chan Task) *Worker { return &Worker{ TaskQueue: taskQueue, } }

func (w *Worker) start() { go func() { for task := range w.TaskQueue { if task != nil { task() } } }() }

现在我需要你:

  1. 添加 UT 到 gopool_test.go 中;
  2. 再添加性能测试代码,看下 Pool 容量为10000时,处理一百万个简单 tasks 耗时需要多久;
  3. 再添加不使用 GoPool 场景下的性能测试代码,看下直接用 go 开 goroutines 处理一百万个简单 tasks 耗时需要多久。

avatar DevChat

以下是我为 GoPool 添加的单元测试和性能测试代码:

gopool_test.go 文件中:

package gopool

import (
    "testing"
    "time"
)

func TestGoPool(t *testing.T) {
    pool := NewGoPool(100)
    for i := 0; i < 1000; i++ {
        pool.AddTask(func() {
            time.Sleep(10 * time.Millisecond)
        })
    }
    pool.Release()
}

func BenchmarkGoPool(b *testing.B) {
    pool := NewGoPool(10000)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        pool.AddTask(func() {
            time.Sleep(10 * time.Millisecond)
        })
    }
    pool.Release()
}

func BenchmarkGoroutines(b *testing.B) {
    tasks := make(chan Task, b.N)
    for i := 0; i < b.N; i++ {
        tasks <- func() {
            time.Sleep(10 * time.Millisecond)
        }
    }
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        go (<-tasks)()
    }
    close(tasks)
}

在这个测试中,TestGoPool 测试了 GoPool 的基本功能,即添加任务和释放 Pool。BenchmarkGoPoolBenchmarkGoroutines 分别测试了使用 GoPool 和直接使用 goroutines 来处理一百万个简单任务的性能。

请注意,这些测试中的任务都是一个简单的函数,只是简单地休眠了一段时间。在实际的应用中,任务可能会更复杂,所以这些测试结果可能并不能完全反映出 GoPool 在实际应用中的性能。