]> Cypherpunks repositories - gostls13.git/commitdiff
net: add benchmark test for SendFile
authorAndy Pan <panjf2000@gmail.com>
Fri, 26 Aug 2022 17:55:05 +0000 (01:55 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 6 Sep 2022 16:58:27 +0000 (16:58 +0000)
BenchmarkSendFile/1024-4                  716760              1582 ns/op         647.31 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/2048-4                  624632              2057 ns/op         995.55 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/4096-4                  429459              2665 ns/op        1537.06 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/8192-4                  275941              4996 ns/op        1639.56 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/16384-4                 149577              8522 ns/op        1922.58 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/32768-4                  75427             14791 ns/op        2215.47 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/65536-4                  43912             28402 ns/op        2307.41 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/131072-4                 23509             48657 ns/op        2693.82 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/262144-4                 12512             91791 ns/op        2855.87 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/524288-4                  5760            579891 ns/op         904.12 MB/s           0 B/op          0 allocs/op
BenchmarkSendFile/1048576-4                 3020            344129 ns/op        3047.05 MB/s           0 B/op          0 allocs/op

Change-Id: Iaf75e19c9ae8d77b89b3eabb2e9142f59c124536
Reviewed-on: https://go-review.googlesource.com/c/go/+/425878
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Andy Pan <panjf2000@gmail.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/net/sendfile_linux_test.go [new file with mode: 0644]

diff --git a/src/net/sendfile_linux_test.go b/src/net/sendfile_linux_test.go
new file mode 100644 (file)
index 0000000..2ca4ec0
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build linux
+// +build linux
+
+package net
+
+import (
+       "io"
+       "os"
+       "strconv"
+       "testing"
+)
+
+func BenchmarkSendFile(b *testing.B) {
+       for i := 0; i <= 10; i++ {
+               size := 1 << (i + 10)
+               bench := sendFileBench{chunkSize: size}
+               b.Run(strconv.Itoa(size), bench.benchSendFile)
+       }
+}
+
+type sendFileBench struct {
+       chunkSize int
+}
+
+func (bench sendFileBench) benchSendFile(b *testing.B) {
+       fileSize := b.N * bench.chunkSize
+       f := createTempFile(b, fileSize)
+       fileName := f.Name()
+       defer os.Remove(fileName)
+       defer f.Close()
+
+       client, server := spliceTestSocketPair(b, "tcp")
+       defer server.Close()
+
+       cleanUp, err := startSpliceClient(client, "r", bench.chunkSize, fileSize)
+       if err != nil {
+               b.Fatal(err)
+       }
+       defer cleanUp()
+
+       b.ReportAllocs()
+       b.SetBytes(int64(bench.chunkSize))
+       b.ResetTimer()
+
+       // Data go from file to socket via sendfile(2).
+       sent, err := io.Copy(server, f)
+       if err != nil {
+               b.Fatalf("failed to copy data with sendfile, error: %v", err)
+       }
+       if sent != int64(fileSize) {
+               b.Fatalf("bytes sent mismatch\n\texpect: %d\n\tgot: %d", fileSize, sent)
+       }
+}
+
+func createTempFile(b *testing.B, size int) *os.File {
+       f, err := os.CreateTemp("", "linux-sendfile-test")
+       if err != nil {
+               b.Fatalf("failed to create tmp directory: %v", err)
+       }
+
+       data := make([]byte, size)
+       if _, err := f.Write(data); err != nil {
+               b.Fatalf("failed to create and feed the file: %v", err)
+       }
+       if err := f.Sync(); err != nil {
+               b.Fatalf("failed to save the file: %v", err)
+       }
+       if _, err := f.Seek(0, io.SeekStart); err != nil {
+               b.Fatalf("failed to rewind the file: %v", err)
+       }
+
+       return f
+}