github.com/NVIDIA/aistore@v1.3.23-0.20240517131212-7df6609be51d/bench/microbenchmarks/lstat/parallel_test.go (about)

     1  // Package lstat compares access(), stat() and lstat() (syscall) latencies
     2  /*
     3   * Copyright (c) 2018-2021, NVIDIA CORPORATION. All rights reserved.
     4   */
     5  
     6  // # Generate files prior to running this one, e.g.:
     7  // $ mkdir /tmp/w; for f in {10000..99999}; do echo "$RANDOM -- $RANDOM" > /tmp/w/$f.txt; done
     8  //
     9  // # Run:
    10  // go test -bench=. -benchtime=20s -benchmem
    11  
    12  package lstat_test
    13  
    14  import (
    15  	"fmt"
    16  	"os"
    17  	"strconv"
    18  	"syscall"
    19  	"testing"
    20  )
    21  
    22  const dir = "/tmp/w/"
    23  
    24  func init() {
    25  	if _, err := os.Stat("/tmp/w/12345.txt"); err != nil {
    26  		fmt.Println("Reminder to generate random files as follows (e.g.):")
    27  		fmt.Println(`
    28  $ mkdir /tmp/w; for f in {10000..99999}; do echo "$RANDOM -- $RANDOM" > /tmp/w/$f.txt; done`)
    29  		os.Exit(0)
    30  	}
    31  }
    32  
    33  func syscallAccess(path string) error { return syscall.Access(path, syscall.F_OK) }
    34  
    35  func access(b *testing.B, path string) {
    36  	if err := syscallAccess(path); err != nil {
    37  		b.Fatalf("%s: %v", path, err)
    38  	}
    39  }
    40  
    41  func stat(b *testing.B, path string) {
    42  	if _, err := os.Stat(path); err != nil {
    43  		b.Fatalf("%s: %v", path, err)
    44  	}
    45  }
    46  
    47  func lstat(b *testing.B, path string) {
    48  	if _, err := os.Lstat(path); err != nil {
    49  		b.Fatalf("%s: %v", path, err)
    50  	}
    51  }
    52  
    53  func open(b *testing.B, path string) {
    54  	if file, err := os.Open(path); err != nil {
    55  		b.Fatalf("%s: %v", path, err)
    56  	} else {
    57  		file.Close()
    58  	}
    59  }
    60  
    61  func syscallStat(b *testing.B, path string) {
    62  	var sys syscall.Stat_t
    63  	if err := syscall.Stat(path, &sys); err != nil {
    64  		b.Fatalf("%s: %v", path, err)
    65  	}
    66  }
    67  
    68  func BenchmarkParallel(b *testing.B) {
    69  	tests := []struct {
    70  		tag string
    71  		f   func(b *testing.B, path string)
    72  	}{
    73  		{"access", access},
    74  		{"stat", stat},
    75  		{"lstat", lstat},
    76  		{"open", open},
    77  		{"syscall-stat", syscallStat},
    78  	}
    79  	for _, test := range tests {
    80  		b.Run(test.tag, func(b *testing.B) { all(b, test.f) })
    81  	}
    82  }
    83  
    84  func all(b *testing.B, f func(b *testing.B, path string)) {
    85  	b.RunParallel(func(pb *testing.PB) {
    86  		for pb.Next() {
    87  			for i := 10000; i < 100000; i++ {
    88  				f(b, dir+strconv.Itoa(i)+".txt")
    89  			}
    90  		}
    91  	})
    92  }