[ARVADOS] updated: 1.1.0-166-g08fe6b0

Git user git at public.curoverse.com
Thu Nov 23 10:13:33 EST 2017


Summary of changes:
 sdk/go/asyncbuf/buf.go      |  6 ++++--
 sdk/go/asyncbuf/buf_test.go | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 2 deletions(-)

       via  08fe6b0770ad8b4aa5115052126f1e0d51dca1fa (commit)
      from  4f1a135e93df78bb833dff32562efe713c6f690e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 08fe6b0770ad8b4aa5115052126f1e0d51dca1fa
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Nov 23 09:33:34 2017 -0500

    12475: Faster asyncbuf.
    
    Unlock earlier so multiple readers can copy bytes concurrently.
    
    100 readers: improves from 4.5 GB/s to 17 GB/s
    1 reader: unchanged 0.75 GB/s
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/asyncbuf/buf.go b/sdk/go/asyncbuf/buf.go
index b3b9bf2..ebe0301 100644
--- a/sdk/go/asyncbuf/buf.go
+++ b/sdk/go/asyncbuf/buf.go
@@ -86,14 +86,16 @@ type reader struct {
 
 func (r *reader) Read(p []byte) (int, error) {
 	r.b.cond.L.Lock()
-	defer r.b.cond.L.Unlock()
 	for {
 		if r.b.data.Len() > r.read || len(p) == 0 {
-			n := copy(p, r.b.data.Bytes()[r.read:])
+			buf := r.b.data.Bytes()
+			r.b.cond.L.Unlock()
+			n := copy(p, buf[r.read:])
 			r.read += n
 			return n, nil
 		}
 		if r.b.err != nil {
+			r.b.cond.L.Unlock()
 			return 0, r.b.err
 		}
 		r.b.cond.Wait()
diff --git a/sdk/go/asyncbuf/buf_test.go b/sdk/go/asyncbuf/buf_test.go
index 845853b..198ebaf 100644
--- a/sdk/go/asyncbuf/buf_test.go
+++ b/sdk/go/asyncbuf/buf_test.go
@@ -10,6 +10,8 @@ import (
 	"io"
 	"io/ioutil"
 	"math/rand"
+	"sync"
+	"sync/atomic"
 	"testing"
 	"time"
 
@@ -144,6 +146,43 @@ func (s *Suite) TestManyReaders(c *check.C) {
 	}
 }
 
+func (s *Suite) BenchmarkOneReader(c *check.C) {
+	s.benchmarkReaders(c, 1)
+}
+
+func (s *Suite) BenchmarkManyReaders(c *check.C) {
+	s.benchmarkReaders(c, 100)
+}
+
+func (s *Suite) benchmarkReaders(c *check.C, readers int) {
+	var n int64
+	t0 := time.Now()
+
+	buf := make([]byte, 10000)
+	rand.Read(buf)
+	for i := 0; i < 10; i++ {
+		b := NewBuffer(nil)
+		go func() {
+			for i := 0; i < c.N; i++ {
+				b.Write(buf)
+			}
+			b.Close()
+		}()
+
+		var wg sync.WaitGroup
+		for i := 0; i < readers; i++ {
+			wg.Add(1)
+			go func() {
+				defer wg.Done()
+				nn, _ := io.Copy(ioutil.Discard, b.NewReader())
+				atomic.AddInt64(&n, int64(nn))
+			}()
+		}
+		wg.Wait()
+	}
+	c.Logf("%d bytes, %.0f MB/s", n, float64(n)/time.Since(t0).Seconds()/1000000)
+}
+
 func (s *Suite) checkReader(c *check.C, r io.Reader, expectData []byte, expectError error, done chan bool) {
 	buf, err := ioutil.ReadAll(r)
 	c.Check(err, check.Equals, expectError)

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list