github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/net/sendfile_linux_test.go (about) 1 // Copyright 2022 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build linux 6 // +build linux 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 // Data go from file to socket via sendfile(2). 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 }