00, "Amount of work for each reader") ? ? 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 { ? ? ? ? pprof.StopCPUProfile() ? ? ? ? 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) }
|