I bet you get wildly differing results with each run. That's an
indicator that your sample size is not statistically relevant (there's
randomness introduced both in the select, as well as in the OS and Go
schedulers).

Increase the iterations until your results stabilize, then you'll see
what the real behaviour is:

$ for i in 100000 1000000 10000000 100000000 1000000000; do echo $i;
go run t.go $i; done
100000
pass one: 48154/51846=0.93
pass two: 41040/58960=0.70
pass three: 54133/45867=1.18
1000000
pass one: 531420/468580=1.13
pass two: 671204/328796=2.04
pass three: 481769/518231=0.93
10000000
pass one: 4983060/5016940=0.99
pass two: 5475692/4524308=1.21
pass three: 4865659/5134341=0.95
100000000
pass one: 50361915/49638085=1.01
pass two: 54589075/45410925=1.20
pass three: 47290086/52709914=0.90

On Thu, Jan 26, 2017 at 5:06 AM, T L <tapir....@gmail.com> wrote:
>
> package main
>
> import "fmt"
>
> func main() {
>     c0, c1 := make(chan int, 10), make(chan int, 10)
>
>     go func() {
>         for {
>             c0 <- 0
>         }
>     }()
>
>     go func() {
>         for {
>             c1 <- 1
>         }
>     }()
>
>     var n0, n1 int
>
>     f0 := func() {
>         n0++
>     }
>
>     f1 := func() {
>         n1++
>     }
>
>     // pass one
>
>     n0, n1 = 0, 0
>     for range [300000]struct{}{} {
>         select {
>         case <- c0: f0()
>         case <- c1: f1()
>         }
>     }
>
>     fmt.Printf("pass one: %d/%d=%.2f \n", n0, n1, float64(n0) / float64(n1))
>
>     // pass two
>
>     n0, n1 = 0, 0
>     for range [300000]struct{}{} {
>         select {
>         case <- c0: f0()
>         case <- c1: f1()
>         case <- c1: f1()
>         }
>     }
>
>     fmt.Printf("pass two: %d/%d=%.2f \n", n0, n1, float64(n0) / float64(n1))
>
>     // pass three
>
>     n0, n1 = 0, 0
>     for range [300000]struct{}{} {
>         select {
>         case <- c0: f0()
>         case <- c0: f0()
>         case <- c1: f1()
>         }
>     }
>
>     fmt.Printf("pass three: %d/%d=%.2f \n", n0, n1, float64(n0) /
> float64(n1))
> }
>
> The output:
>
> pass one: 154970/145030=1.07
> pass two: 177853/122147=1.46
> pass three: 127768/172232=0.74
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to