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 }