Skip to content

Instantly share code, notes, and snippets.

@szaydel
Last active March 18, 2021 11:47
Show Gist options
  • Save szaydel/0be7f8ebba67d716a062a192063de4ea to your computer and use it in GitHub Desktop.
Save szaydel/0be7f8ebba67d716a062a192063de4ea to your computer and use it in GitHub Desktop.
package main
import (
"io"
"io/ioutil"
"log"
"net"
"os"
"syscall"
"time"
)
const MB = 1024 * 1024
func socketPairUnix(typ int) (*net.UnixConn, *net.UnixConn) {
fds, err := syscall.Socketpair(syscall.AF_UNIX, typ, 0)
if err != nil {
panic(os.NewSyscallError("socketpair", err))
}
file := os.NewFile(uintptr(fds[0]), "")
conn0, err := net.FileConn(file)
if err != nil {
panic(err)
}
if err := file.Close(); err != nil {
panic(err)
}
file = os.NewFile(uintptr(fds[1]), "")
conn1, err := net.FileConn(file)
if err != nil {
panic(err)
}
if err := file.Close(); err != nil {
panic(err)
}
return conn0.(*net.UnixConn), conn1.(*net.UnixConn)
}
func main() {
left, right := socketPairUnix(syscall.SOCK_STREAM)
doneChan := make(chan struct{})
go func(r io.ReadCloser, doneChan chan struct{}) {
defer r.Close()
_, err := io.Copy(ioutil.Discard, r)
if err != nil {
log.Fatalf("ERR: %v", err)
}
doneChan <- struct{}{}
}(right, doneChan)
start := time.Now()
nwritten := 0
for i := 0; i < 1000; i++ {
buf := make([]byte, 64*1024)
n, _ := left.Write(buf)
nwritten += n
}
left.Close()
delta := time.Now().Sub(start)
mbs := float64(nwritten) / MB
log.Printf("[W]: %d(b) %d(ms) %f(MB/s)", nwritten, delta.Milliseconds(), mbs/delta.Seconds())
<-doneChan
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment