5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-14 15:00:28 +00:00
yggdrasil-go/misc/tests/pool.go
2018-01-04 22:37:51 +00:00

90 lines
1.5 KiB
Go

package main
import "fmt"
//import "net"
import "time"
import "runtime"
import "sync/atomic"
func poolbench() {
nWorkers := runtime.GOMAXPROCS(0)
work := make(chan func(), 1)
workers := make(chan chan<- func(), nWorkers)
makeWorker := func() chan<- func() {
ch := make(chan func())
go func() {
for {
f := <-ch
f()
select {
case workers <- (ch):
default:
return
}
}
}()
return ch
}
getWorker := func() chan<- func() {
select {
case ch := <-workers:
return ch
default:
return makeWorker()
}
}
dispatcher := func() {
for {
w := <-work
ch := getWorker()
ch <- w
}
}
go dispatcher()
var count uint64
const nCounts = 1000000
for idx := 0; idx < nCounts; idx++ {
f := func() { atomic.AddUint64(&count, 1) }
work <- f
}
for atomic.LoadUint64(&count) < nCounts {
}
}
func normalbench() {
var count uint64
const nCounts = 1000000
ch := make(chan struct{}, 1)
ch <- struct{}{}
for idx := 0; idx < nCounts; idx++ {
f := func() { atomic.AddUint64(&count, 1) }
f()
<-ch
ch <- struct{}{}
}
}
func gobench() {
var count uint64
const nCounts = 1000000
for idx := 0; idx < nCounts; idx++ {
f := func() { atomic.AddUint64(&count, 1) }
go f()
}
for atomic.LoadUint64(&count) < nCounts {
}
}
func main() {
start := time.Now()
poolbench()
fmt.Println(time.Since(start))
start = time.Now()
normalbench()
fmt.Println(time.Since(start))
start = time.Now()
gobench()
fmt.Println(time.Since(start))
}