Source file src/net/sendfile_linux_test.go

     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  }
    78  

View as plain text