Skip to content

Instantly share code, notes, and snippets.

@odeke-em
Created June 26, 2016 22:22
Show Gist options
  • Save odeke-em/4a38dca66b8aed5ac863f3623f2b8bfa to your computer and use it in GitHub Desktop.
Save odeke-em/4a38dca66b8aed5ac863f3623f2b8bfa to your computer and use it in GitHub Desktop.
io-vs-os:Pipe-comparisons to see which is better for use
package io_vs_os_test
import (
"io"
"io/ioutil"
"os"
"testing"
)
var (
_1kB int64 = 1 << 10
_1mB int64 = 1 << 20
_10mB int64 = _1mB * 10
_100mB int64 = _1mB * 100
_1gB int64 = 1 << 30
)
func BenchmarkIOPipe1kB(b *testing.B) { benchmarkIt(b, ioPipe, _1kB) }
func BenchmarkOSPipe1kB(b *testing.B) { benchmarkIt(b, osPipe, _1kB) }
func BenchmarkIOPipe1mB(b *testing.B) { benchmarkIt(b, ioPipe, _1mB) }
func BenchmarkOSPipe1mB(b *testing.B) { benchmarkIt(b, osPipe, _1mB) }
func BenchmarkIOPipe10mB(b *testing.B) { benchmarkIt(b, ioPipe, _10mB) }
func BenchmarkOSPipe10mB(b *testing.B) { benchmarkIt(b, osPipe, _10mB) }
func BenchmarkIOPipe100mB(b *testing.B) { benchmarkIt(b, ioPipe, _100mB) }
func BenchmarkOSPipe100mB(b *testing.B) { benchmarkIt(b, osPipe, _100mB) }
func BenchmarkIOPipe1gB(b *testing.B) { benchmarkIt(b, ioPipe, _1gB) }
func BenchmarkOSPipe1gB(b *testing.B) { benchmarkIt(b, osPipe, _1gB) }
func ioPipe(byteCount int64) error {
prc, pwc := io.Pipe()
return urandomAndDiscardIt(prc, pwc, byteCount)
}
func osPipe(byteCount int64) error {
prc, pwc, err := os.Pipe()
if err != nil {
return err
}
return urandomAndDiscardIt(prc, pwc, byteCount)
}
func benchmarkIt(b *testing.B, fn func(int64) error, byteCount int64) {
for i := 0; i < b.N; i++ {
_ = fn(byteCount)
}
}
func urandomAndDiscardIt(rc io.ReadCloser, wc io.WriteCloser, byteCount int64) error {
urandom, err := os.Open("/dev/urandom")
if err != nil {
return err
}
go func() {
_, _ = io.CopyN(wc, urandom, byteCount)
_ = wc.Close()
_ = urandom.Close()
}()
_, err = io.Copy(ioutil.Discard, rc)
return err
}
$ go test -v -bench=.
testing: warning: no tests to run
BenchmarkIOPipe1kB-4     	   20000	     92145 ns/op
BenchmarkOSPipe1kB-4     	       1	75417337915 ns/op
BenchmarkIOPipe1mB-4     	      20	  73405145 ns/op
BenchmarkOSPipe1mB-4     	      20	  73737580 ns/op
BenchmarkIOPipe10mB-4    	       2	 741943114 ns/op
BenchmarkOSPipe10mB-4    	       2	 734819553 ns/op
BenchmarkIOPipe100mB-4   	       1	7343112192 ns/op
BenchmarkOSPipe100mB-4   	       1	7344096151 ns/op
BenchmarkIOPipe1gB-4     	       1	75750920371 ns/op
BenchmarkOSPipe1gB-4     	       1	75563199408 ns/op
PASS
ok  	_/Users/emmanuelodeke/Desktop/openSrc/io-vs-os	251.726s
$
$ go test -v -bench=.
testing: warning: no tests to run
BenchmarkIOPipe1kB-4     	   20000	     91875 ns/op
BenchmarkOSPipe1kB-4     	   10000	    114536 ns/op
BenchmarkIOPipe1mB-4     	      20	  75339647 ns/op
BenchmarkOSPipe1mB-4     	      20	  73644476 ns/op
BenchmarkIOPipe10mB-4    	       2	 737125129 ns/op
BenchmarkOSPipe10mB-4    	       2	 735175574 ns/op
BenchmarkIOPipe100mB-4   	       1	7348974566 ns/op
BenchmarkOSPipe100mB-4   	       1	7343368798 ns/op
BenchmarkIOPipe1gB-4     	       1	77079326462 ns/op
BenchmarkOSPipe1gB-4     	       1	76765157429 ns/op
PASS
ok  	_/Users/emmanuelodeke/Desktop/openSrc/io-vs-os	180.014s
$
$ go test -v -bench=.
testing: warning: no tests to run
BenchmarkIOPipe1kB-4     	   20000	     91098 ns/op
BenchmarkOSPipe1kB-4     	   10000	    121953 ns/op
BenchmarkIOPipe1mB-4     	      20	  76778175 ns/op
BenchmarkOSPipe1mB-4     	      20	  74097285 ns/op
BenchmarkIOPipe10mB-4    	       2	 845868509 ns/op
BenchmarkOSPipe10mB-4    	       2	 929460521 ns/op
BenchmarkIOPipe100mB-4   	       1	7514985161 ns/op
BenchmarkOSPipe100mB-4   	       1	7530413446 ns/op
BenchmarkIOPipe1gB-4     	       1	79094082240 ns/op
BenchmarkOSPipe1gB-4     	       1	78463944303 ns/op
PASS
ok  	_/Users/emmanuelodeke/Desktop/openSrc/io-vs-os	184.949s
$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment