From: Matt Joiner Date: Fri, 21 Nov 2014 06:04:07 +0000 (-0600) Subject: Use a buffer to reduce syscall.Write calls X-Git-Tag: v1.0.0~1490 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=0f54c2f79edb077d42b65c67564ac8da0a7adda6;p=btrtrc.git Use a buffer to reduce syscall.Write calls --- 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 + } } } }