From 0f54c2f79edb077d42b65c67564ac8da0a7adda6 Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
Date: Fri, 21 Nov 2014 00:04:07 -0600
Subject: [PATCH] Use a buffer to reduce syscall.Write calls

---
 connection.go | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/connection.go b/connection.go
index c1f337fc..1a75e17a 100644
--- a/connection.go
+++ b/connection.go
@@ -1,6 +1,7 @@
 package torrent
 
 import (
+	"bufio"
 	"container/list"
 	"encoding"
 	"errors"
@@ -301,19 +302,34 @@ var (
 
 // Writes buffers to the socket from the write channel.
 func (conn *connection) writer() {
+	// Reduce write syscalls.
+	buf := bufio.NewWriterSize(conn.Socket, 0x8000) // 32 KiB
+	// Returns immediately if the buffer contains data.
+	notEmpty := make(chan struct{}, 1)
 	for {
+		if buf.Buffered() != 0 {
+			select {
+			case notEmpty <- struct{}{}:
+			default:
+			}
+		}
 		select {
 		case b, ok := <-conn.writeCh:
 			if !ok {
 				return
 			}
-			_, err := conn.Socket.Write(b)
+			_, err := buf.Write(b)
 			if err != nil {
 				conn.Close()
 				return
 			}
 		case <-conn.closing:
 			return
+		case <-notEmpty:
+			err := buf.Flush()
+			if err != nil {
+				return
+			}
 		}
 	}
 }
-- 
2.51.0