? ? readers := flag.Int("n", runtime.GOMAXPROCS(0), "Total number of readers")
? ? checkcpu := flag.Uint64("c", 100, "Update CPU estimate every n iterations")
? ? flag.Parse()
?
? ? var o *os.File
? ? if *cpuprofile {
? ? ? ? o, _ := os.Create("rw.out")
? ? ? ? pprof.StartCPUProfile(o)
? ? }
?
? ? readers_per_core := *readers / runtime.GOMAXPROCS(0)
?
? ? var wg sync.WaitGroup
?
? ? var mx1 sync.RWMutex
?
? ? start1 := time.Now()
? ? for n := 0; n < runtime.GOMAXPROCS(0); n++ {
? ? ? ? for r := 0; r < readers_per_core; r++ {
? ? ? ? ? ? wg.Add(1)
? ? ? ? ? ? go func() {
? ? ? ? ? ? ? ? defer wg.Done()
? ? ? ? ? ? ? ? r := rand.New(rand.NewSource(rand.Int63()))
? ? ? ? ? ? ? ? for n := uint64(0); n < *locks; n++ {
? ? ? ? ? ? ? ? ? ? if r.Float64() < *write {
? ? ? ? ? ? ? ? ? ? ? ? mx1.Lock()
? ? ? ? ? ? ? ? ? ? ? ? x := 0
? ? ? ? ? ? ? ? ? ? ? ? for i := 0; i < *wwork; i++ {
? ? ? ? ? ? ? ? ? ? ? ? ? ? x++
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? _ = x
? ? ? ? ? ? ? ? ? ? ? ? mx1.Unlock()
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? mx1.RLock()
? ? ? ? ? ? ? ? ? ? ? ? x := 0
? ? ? ? ? ? ? ? ? ? ? ? for i := 0; i < *rwork; i++ {
? ? ? ? ? ? ? ? ? ? ? ? ? ? x++
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? _ = x
? ? ? ? ? ? ? ? ? ? ? ? mx1.RUnlock()
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }()
? ? ? ? }
? ? }
? ? wg.Wait()
? ? end1 := time.Now()
?
? ? t1 := end1.Sub(start1)
? ? fmt.Println("mx1", runtime.GOMAXPROCS(0), *readers, *locks, *write, *wwork, *rwork, *checkcpu, t1.Seconds(), t1)
?
? ? if *cpuprofile {
? ? ? ? o.Close()
?
? ? ? ? o, _ = os.Create("rw2.out")
? ? ? ? pprof.StartCPUProfile(o)
? ? }
?
? ? mx2 := make(RWMutex2, len(cpus))
?
? ? start2 := time.Now()
? ? for n := 0; n < runtime.GOMAXPROCS(0); n++ {
? ? ? ? for r := 0; r < readers_per_core; r++ {
? ? ? ? ? ? wg.Add(1)
? ? ? ? ? ? go func() {
? ? ? ? ? ? ? ? defer wg.Done()
? ? ? ? ? ? ? ? c := cpus[cpu()]
? ? ? ? ? ? ? ? r := rand.New(rand.NewSource(rand.Int63()))
? ? ? ? ? ? ? ? for n := uint64(0); n < *locks; n++ {
? ? ? ? ? ? ? ? ? ? if *checkcpu != 0 && n%*checkcpu == 0 {
? ? ? ? ? ? ? ? ? ? ? ? c = cpus[cpu()]
? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? ? ? if r.Float64() < *write {
? ? ? ? ? ? ? ? ? ? ? ? mx2.Lock()
? ? ? ? ? ? ? ? ? ? ? ? x := 0
? ? ? ? ? ? ? ? ? ? ? ? for i := 0; i < *wwork; i++ {
? ? ? ? ? ? ? ? ? ? ? ? ? ? x++
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? _ = x
? ? ? ? ? ? ? ? ? ? ? ? mx2.Unlock()
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? mx2[c].RLock()
? ? ? ? ? ? ? ? ? ? ? ? x := 0
? ? ? ? ? ? ? ? ? ? ? ? for i := 0; i < *rwork; i++ {
? ? ? ? ? ? ? ? ? ? ? ? ? ? x++
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? _ = x
? ? ? ? ? ? ? ? ? ? ? ? mx2[c].RUnlock()
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }()
? ? ? ? }
? ? }
? ? wg.Wait()
? ? end2 := time.Now()
?
? ? pprof.StopCPUProfile()
? ? o.Close()
?
? ? t2 := end2.Sub(start2)
? ? fmt.Println("mx2", runtime.GOMAXPROCS(0), *readers, *locks, *write, *wwork, *rwork, *checkcpu, t2.Seconds(), t2)
}