|  | @@ -22,7 +22,7 @@ func TestReaderAndWrite(t *testing.T) {
 | 
											
												
													
														|  |  	readerBuffer := bytes.NewReader(buffer)
 |  |  	readerBuffer := bytes.NewReader(buffer)
 | 
											
												
													
														|  |  	writerBuffer := bytes.NewBuffer(make([]byte, 0, size))
 |  |  	writerBuffer := bytes.NewBuffer(make([]byte, 0, size))
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	transportChan := make(chan []byte, size/bufferSize*10)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	transportChan := make(chan []byte, 1024)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	err = ReaderToChan(transportChan, readerBuffer)
 |  |  	err = ReaderToChan(transportChan, readerBuffer)
 | 
											
												
													
														|  |  	assert.Error(err).Equals(io.EOF)
 |  |  	assert.Error(err).Equals(io.EOF)
 | 
											
										
											
												
													
														|  | @@ -52,43 +52,96 @@ func (reader *StaticReader) Read(b []byte) (size int, err error) {
 | 
											
												
													
														|  |  	return
 |  |  	return
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func BenchmarkTransport(b *testing.B) {
 |  | 
 | 
											
												
													
														|  | -	size := 1024 * 1024
 |  | 
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport1K(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 1 * 1024
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	for i := 0; i < b.N; i++ {
 |  |  	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | -		transportChanA := make(chan []byte, 128)
 |  | 
 | 
											
												
													
														|  | -		transportChanB := make(chan []byte, 128)
 |  | 
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		readerA := &StaticReader{size, 0}
 |  | 
 | 
											
												
													
														|  | -		readerB := &StaticReader{size, 0}
 |  | 
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport2K(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 2 * 1024
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		writerA := ioutil.Discard
 |  | 
 | 
											
												
													
														|  | -		writerB := ioutil.Discard
 |  | 
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		finishA := make(chan bool)
 |  | 
 | 
											
												
													
														|  | -		finishB := make(chan bool)
 |  | 
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport4K(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 4 * 1024
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		go func() {
 |  | 
 | 
											
												
													
														|  | -			ChanToWriter(writerA, transportChanA)
 |  | 
 | 
											
												
													
														|  | -			close(finishA)
 |  | 
 | 
											
												
													
														|  | -		}()
 |  | 
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		go func() {
 |  | 
 | 
											
												
													
														|  | -			ReaderToChan(transportChanA, readerA)
 |  | 
 | 
											
												
													
														|  | -			close(transportChanA)
 |  | 
 | 
											
												
													
														|  | -		}()
 |  | 
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport10K(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 10 * 1024
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		go func() {
 |  | 
 | 
											
												
													
														|  | -			ChanToWriter(writerB, transportChanB)
 |  | 
 | 
											
												
													
														|  | -			close(finishB)
 |  | 
 | 
											
												
													
														|  | -		}()
 |  | 
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		go func() {
 |  | 
 | 
											
												
													
														|  | -			ReaderToChan(transportChanB, readerB)
 |  | 
 | 
											
												
													
														|  | -			close(transportChanB)
 |  | 
 | 
											
												
													
														|  | -		}()
 |  | 
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport100K(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 100 * 1024
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		<-transportChanA
 |  | 
 | 
											
												
													
														|  | -		<-transportChanB
 |  | 
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport1M(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 1024 * 1024
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func BenchmarkTransport10M(b *testing.B) {
 | 
											
												
													
														|  | 
 |  | +	size := 10 * 1024 * 1024
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	for i := 0; i < b.N; i++ {
 | 
											
												
													
														|  | 
 |  | +		runBenchmarkTransport(size)
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func runBenchmarkTransport(size int) {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	transportChanA := make(chan []byte, 128)
 | 
											
												
													
														|  | 
 |  | +	transportChanB := make(chan []byte, 128)
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	readerA := &StaticReader{size, 0}
 | 
											
												
													
														|  | 
 |  | +	readerB := &StaticReader{size, 0}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	writerA := ioutil.Discard
 | 
											
												
													
														|  | 
 |  | +	writerB := ioutil.Discard
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	finishA := make(chan bool)
 | 
											
												
													
														|  | 
 |  | +	finishB := make(chan bool)
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	go func() {
 | 
											
												
													
														|  | 
 |  | +		ChanToWriter(writerA, transportChanA)
 | 
											
												
													
														|  | 
 |  | +		close(finishA)
 | 
											
												
													
														|  | 
 |  | +	}()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	go func() {
 | 
											
												
													
														|  | 
 |  | +		ReaderToChan(transportChanA, readerA)
 | 
											
												
													
														|  | 
 |  | +		close(transportChanA)
 | 
											
												
													
														|  | 
 |  | +	}()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	go func() {
 | 
											
												
													
														|  | 
 |  | +		ChanToWriter(writerB, transportChanB)
 | 
											
												
													
														|  | 
 |  | +		close(finishB)
 | 
											
												
													
														|  | 
 |  | +	}()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	go func() {
 | 
											
												
													
														|  | 
 |  | +		ReaderToChan(transportChanB, readerB)
 | 
											
												
													
														|  | 
 |  | +		close(transportChanB)
 | 
											
												
													
														|  | 
 |  | +	}()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	<-transportChanA
 | 
											
												
													
														|  | 
 |  | +	<-transportChanB
 | 
											
												
													
														|  | 
 |  | +}
 |