$ 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
$
Created
June 26, 2016 22:22
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment