Source file
src/net/sendfile_linux_test.go
1
2
3
4
5
6
7
8 package net
9
10 import (
11 "io"
12 "os"
13 "strconv"
14 "testing"
15 )
16
17 func BenchmarkSendFile(b *testing.B) {
18 for i := 0; i <= 10; i++ {
19 size := 1 << (i + 10)
20 bench := sendFileBench{chunkSize: size}
21 b.Run(strconv.Itoa(size), bench.benchSendFile)
22 }
23 }
24
25 type sendFileBench struct {
26 chunkSize int
27 }
28
29 func (bench sendFileBench) benchSendFile(b *testing.B) {
30 fileSize := b.N * bench.chunkSize
31 f := createTempFile(b, fileSize)
32 fileName := f.Name()
33 defer os.Remove(fileName)
34 defer f.Close()
35
36 client, server := spliceTestSocketPair(b, "tcp")
37 defer server.Close()
38
39 cleanUp, err := startSpliceClient(client, "r", bench.chunkSize, fileSize)
40 if err != nil {
41 b.Fatal(err)
42 }
43 defer cleanUp()
44
45 b.ReportAllocs()
46 b.SetBytes(int64(bench.chunkSize))
47 b.ResetTimer()
48
49
50 sent, err := io.Copy(server, f)
51 if err != nil {
52 b.Fatalf("failed to copy data with sendfile, error: %v", err)
53 }
54 if sent != int64(fileSize) {
55 b.Fatalf("bytes sent mismatch\n\texpect: %d\n\tgot: %d", fileSize, sent)
56 }
57 }
58
59 func createTempFile(b *testing.B, size int) *os.File {
60 f, err := os.CreateTemp("", "linux-sendfile-test")
61 if err != nil {
62 b.Fatalf("failed to create temporary file: %v", err)
63 }
64
65 data := make([]byte, size)
66 if _, err := f.Write(data); err != nil {
67 b.Fatalf("failed to create and feed the file: %v", err)
68 }
69 if err := f.Sync(); err != nil {
70 b.Fatalf("failed to save the file: %v", err)
71 }
72 if _, err := f.Seek(0, io.SeekStart); err != nil {
73 b.Fatalf("failed to rewind the file: %v", err)
74 }
75
76 return f
77 }
78
View as plain text