| // Copyright 2024 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 || solaris |
| |
| package os_test |
| |
| import ( |
| "io" |
| . "os" |
| "testing" |
| ) |
| |
| func BenchmarkSendFile(b *testing.B) { |
| hook := hookSendFileTB(b) |
| |
| // 1 GiB file size for copy. |
| const fileSize = 1 << 30 |
| |
| src, _ := createTempFile(b, "benchmark-sendfile-src", int64(fileSize)) |
| dst, err := CreateTemp(b.TempDir(), "benchmark-sendfile-dst") |
| if err != nil { |
| b.Fatalf("failed to create temporary file of destination: %v", err) |
| } |
| b.Cleanup(func() { |
| dst.Close() |
| }) |
| |
| b.ReportAllocs() |
| b.SetBytes(int64(fileSize)) |
| b.ResetTimer() |
| |
| for i := 0; i <= b.N; i++ { |
| sent, err := io.Copy(dst, src) |
| |
| if err != nil { |
| b.Fatalf("failed to copy data: %v", err) |
| } |
| if !hook.called { |
| b.Fatalf("should have called the sendfile(2)") |
| } |
| if sent != int64(fileSize) { |
| b.Fatalf("sent %d bytes, want %d", sent, fileSize) |
| } |
| |
| // Rewind the files for the next iteration. |
| if _, err := src.Seek(0, io.SeekStart); err != nil { |
| b.Fatalf("failed to rewind the source file: %v", err) |
| } |
| if _, err := dst.Seek(0, io.SeekStart); err != nil { |
| b.Fatalf("failed to rewind the destination file: %v", err) |
| } |
| } |
| } |