Gestern habe ich eine Frage mit fast demselben Code gestellt und gefragt, wie man dies unter einer variadischen Funktion gleichzeitig machen könnte. Nachdem es gelöst wurde, erwartete ich, dass das Programm fast die gleiche Zeit mit einem Generator wie mit 30+ läuft. Es scheint nicht so.Warum ist das bei Goroutines so langsam?
Die Zeiten, die ich sehe, sind mit einem Generator, etwa 5 ms. Mit, was in dem Code unten ist, 150ms. (Aus irgendeinem Grund zeigt play.golang 0).
Warum ist es langsamer? Ich hatte die Erwartung, dass es mit den vielen Goroutines ungefähr so lange dauern würde. Etwas, das damit zu tun hat, die Goroutines zu drehen?
package main
import (
"fmt"
"sync"
"time"
)
func main() {
t := time.Now()
_ = fanIn(
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
generator(4, 5, 6, 7),
generator(1, 2, 6, 3, 7),
generator(12, 15, 33, 40, 10),
generator(18, 13, 20, 40, 15),
generator(100, 200, 64000, 3121, 1237),
)
fmt.Println(time.Now().Sub(t))
}
func generator(nums ...int) <-chan int {
out := make(chan int, 10)
go func() {
defer close(out)
for _, v := range nums {
out <- v
}
}()
return out
}
func fanIn(in ...<-chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int, 10)
wg.Add(len(in))
go func() {
for _, v := range in {
go func(ch <-chan int) {
defer wg.Done()
for val := range ch {
out <- val
}
}(v)
}
}()
go func() {
wg.Wait()
close(out)
}()
return out
}
Was ist Ihre Go-Version ist, und wie viele CPU-Kerne Sie haben, für mich ist es weniger als 1 ms. –
Ich habe Go-Version Go1.6.2 Darwin/AMD64, MBP 2.9 GHz Intel Core i5. –
Auch ich laufe das mit 'Go run' anstatt zu installieren, was ich glaube, ist das langsamste. Der Test war nicht, es schnell laufen zu lassen, es war zu sehen, ob ich mehrere Generatoren mit der gleichen Geschwindigkeit laufen lassen kann. Nur zu deiner Information. –