diff options
author | Moritz Poldrack | 2021-04-25 22:05:06 +0200 |
---|---|---|
committer | Moritz Poldrack | 2021-04-25 22:05:06 +0200 |
commit | 55fff3af6c81fa6d4163d469e77d067b0170429b (patch) | |
tree | a743628ee24d3f4bec36ce7fff050731cd998bc3 | |
parent | 888bff1170d5586a6ef910d0e84f60385aee50b7 (diff) |
and my high-performance version
-rw-r--r-- | mocking-bob/more-paralellism.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/mocking-bob/more-paralellism.go b/mocking-bob/more-paralellism.go new file mode 100644 index 0000000..64b841b --- /dev/null +++ b/mocking-bob/more-paralellism.go @@ -0,0 +1,84 @@ +package main + +import ( + // we want *real* random + "crypto/rand" + "fmt" + "os" + "unicode" +) + +func main() { + jobList := make(chan [2]chan rune, 4096) + + // spin up an appropriate amount of workers for this task + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + go worker(jobList) + + outchans := make(chan chan rune, 4096) + done := make(chan struct{}, 1) + + go func(o chan chan rune) { + for r := range o { + fmt.Printf("%c", <-r) + } + done <- struct{}{} + }(outchans) + + for _, str := range os.Args[1:] { + for _, c := range str { + in := make(chan rune, 1) + out := make(chan rune, 1) + outchans <- out + jobList <- [2]chan rune{in, out} + in <- c + close(in) + } + out := make(chan rune, 1) + outchans <- out + out <- ' ' + close(out) + } + close(outchans) + + <-done +} + +func worker(jobList chan [2]chan rune) { + b := make([]byte, 1) + for job := range jobList { + c := <-job[0] + _, err := rand.Read(b) + if err != nil { + job[1] <- c + close(job[1]) + continue + } + if b[0]%2 == 0 { + // switch case + if unicode.ToUpper(c) == c { + job[1] <- unicode.ToLower(c) + } else { + job[1] <- unicode.ToUpper(c) + } + close(job[1]) + continue + } + job[1] <- c + close(job[1]) + } +} |