mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2024-12-23 08:27:32 +00:00
84 lines
1.6 KiB
Go
84 lines
1.6 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))
|
||
|
}
|