package test import ( "bufio" "crypto/rand" "encoding/hex" "fmt" "io" "net" "testing" ) var bufSize = 32768 func sendLoop(b *testing.B, port int) { u := make([]byte, bufSize) io.ReadFull(rand.Reader, u) str := hex.EncodeToString(u) conn, err := net.Dial("tcp", fmt.Sprintf(":%d", port)) if err != nil { b.Fatalf("Error on Dial: %v", err) return } bw := bufio.NewWriterSize(conn, bufSize) for i := 0; i < b.N; i++ { bw.WriteString(str) } bw.Flush() } func recvLoop(b *testing.B, conn net.Conn) { buf := make([]byte, bufSize) b.SetBytes(int64(bufSize)) total := 0 toRead := b.N * bufSize for total <= toRead { n, err := conn.Read(buf) if err != nil { b.Fatalf("Error reading: %v\n", err) } total += n } } func setup(b *testing.B) (net.Listener, int) { l, e := net.Listen("tcp", ":0") if e != nil { b.Fatalf("Error listening: %v", e) } port := l.Addr().(*net.TCPAddr).Port return l, port } func Benchmark_MavericksSocketIONoBuffer(b *testing.B) { b.StopTimer() l, port := setup(b) go sendLoop(b, port) conn, err := l.Accept() if err != nil { b.Fatalf("Error accepting on port: %d - %v", port, err) } b.StartTimer() recvLoop(b, conn) } func Benchmark_MavericksSocketIORegression(b *testing.B) { b.StopTimer() l, port := setup(b) go sendLoop(b, port) conn, err := l.Accept() if err != nil { b.Fatalf("Error accepting on port: %d - %v", port, err) } //////////////////////////////////////////////////////////////////////////// // BUG is here // This causes Reads to stall on Mavericks under 1.2 and 1.1.2 if ip, ok := conn.(*net.TCPConn); ok { ip.SetReadBuffer(bufSize) } //////////////////////////////////////////////////////////////////////////// b.StartTimer() recvLoop(b, conn) }