blob: dbe1603bd15a499622703c25863a76cabb83e64b [file] [log] [blame]
// 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)
}
}
}