github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/internal/sysfs/bench_test.go (about)

     1  package sysfs
     2  
     3  import (
     4  	"io"
     5  	"io/fs"
     6  	"os"
     7  	"path"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/tetratelabs/wazero/experimental/sys"
    12  )
    13  
    14  func BenchmarkFsFileUtimesNs(b *testing.B) {
    15  	f, errno := OpenOSFile(path.Join(b.TempDir(), "file"), sys.O_CREAT, 0)
    16  	if errno != 0 {
    17  		b.Fatal(errno)
    18  	}
    19  	defer f.Close()
    20  
    21  	atim := int64(123*time.Second + 4*time.Microsecond)
    22  	mtim := atim
    23  
    24  	b.ResetTimer()
    25  	for i := 0; i < b.N; i++ {
    26  		if errno := f.Utimens(atim, mtim); errno != 0 {
    27  			b.Fatal(errno)
    28  		}
    29  	}
    30  }
    31  
    32  func BenchmarkFsFileRead(b *testing.B) {
    33  	dirFS := os.DirFS("testdata")
    34  	embedFS, err := fs.Sub(testdata, "testdata")
    35  	if err != nil {
    36  		b.Fatal(err)
    37  	}
    38  
    39  	benches := []struct {
    40  		name  string
    41  		fs    fs.FS
    42  		pread bool
    43  	}{
    44  		{name: "os.DirFS Read", fs: dirFS, pread: false},
    45  		{name: "os.DirFS Pread", fs: dirFS, pread: true},
    46  		{name: "embed.api.FS Read", fs: embedFS, pread: false},
    47  		{name: "embed.api.FS Pread", fs: embedFS, pread: true},
    48  	}
    49  
    50  	buf := make([]byte, 3)
    51  
    52  	for _, bc := range benches {
    53  		bc := bc
    54  
    55  		b.Run(bc.name, func(b *testing.B) {
    56  			name := "wazero.txt"
    57  			f, errno := OpenFSFile(bc.fs, name, sys.O_RDONLY, 0)
    58  			if errno != 0 {
    59  				b.Fatal(errno)
    60  			}
    61  			defer f.Close()
    62  
    63  			b.ResetTimer()
    64  			for i := 0; i < b.N; i++ {
    65  				b.StopTimer()
    66  
    67  				var n int
    68  				var errno sys.Errno
    69  
    70  				// Reset the read position back to the beginning of the file.
    71  				if _, errno = f.Seek(0, io.SeekStart); errno != 0 {
    72  					b.Fatal(errno)
    73  				}
    74  
    75  				b.StartTimer()
    76  				if bc.pread {
    77  					n, errno = f.Pread(buf, 3)
    78  				} else {
    79  					n, errno = f.Read(buf)
    80  				}
    81  				b.StopTimer()
    82  
    83  				if errno != 0 {
    84  					b.Fatal(errno)
    85  				} else if bufLen := len(buf); n < bufLen {
    86  					b.Fatalf("nread %d less than capacity %d", n, bufLen)
    87  				}
    88  			}
    89  		})
    90  	}
    91  }