github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xtest/fperf.go (about) 1 package xtest 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8 "sync/atomic" 9 ) 10 11 type FPerf struct { 12 Path string 13 Clear bool 14 } 15 16 func NewFPerf(path string) *FPerf { 17 return &FPerf{ 18 Path: path, 19 Clear: true, 20 } 21 } 22 23 func (f *FPerf) Write(name string, bs int64, count int) error { 24 buf := make([]byte, bs) 25 tf, err := os.OpenFile(filepath.Join(f.Path, name), os.O_CREATE|os.O_WRONLY, os.ModePerm) 26 if err != nil { 27 return err 28 } 29 defer tf.Close() 30 for i := 0; i < count; i++ { 31 _, err = tf.Write(buf) 32 if err != nil { 33 return err 34 } 35 } 36 return nil 37 } 38 39 func (f *FPerf) Read(name string) (int64, error) { 40 buf := make([]byte, 10240) 41 tf, err := os.Open(filepath.Join(f.Path, name)) 42 if err != nil { 43 return 0, err 44 } 45 defer tf.Close() 46 var readed int64 = 0 47 var tr int = 0 48 for { 49 if tr, err = tf.Read(buf); err != nil { 50 break 51 } else { 52 readed += int64(tr) 53 } 54 } 55 if err == io.EOF { 56 err = nil 57 } 58 return readed, err 59 } 60 func (f *FPerf) remove(name string) { 61 os.Remove(filepath.Join(f.Path, name)) 62 } 63 64 func (f *FPerf) Rw(name string, bs int64, count int) error { 65 err := f.Write(name, bs, count) 66 if err == nil { 67 _, err = f.Read(name) 68 return err 69 } else { 70 return err 71 } 72 73 } 74 75 func (f *FPerf) Perf4MultiW(pref, logf string, fc, max int, bs int64, count int) (int64, error) { 76 var terr error 77 used, err := DoPerfV(fc, max, logf, func(v int) { 78 tp := fmt.Sprintf("%v%v", pref, v) 79 err := f.Write(tp, bs, count) 80 if err != nil { 81 terr = err 82 fmt.Printf("TestMultiW error to (%v) on path(%v) error->%v\n", tp, f.Path, err.Error()) 83 } 84 if f.Clear { 85 f.remove(tp) 86 } 87 }) 88 if err == nil { 89 err = terr 90 } 91 return used, err 92 } 93 94 func (f *FPerf) Perf4MultiRw(pref, logf string, fc, max int, bs int64, count int) (int64, error) { 95 var terr error 96 used, err := DoPerfV(fc, max, logf, func(v int) { 97 tp := fmt.Sprintf("%v%v", pref, v) 98 err := f.Rw(tp, bs, count) 99 if err != nil { 100 terr = err 101 fmt.Printf("TestMultiRw error to (%v) on path(%v) error->%v\n", tp, f.Path, err.Error()) 102 } 103 if f.Clear { 104 f.remove(tp) 105 } 106 }) 107 if err == nil { 108 err = terr 109 } 110 return used, err 111 } 112 113 func (f *FPerf) Perf4MultiR(pref, logf string, beg, end, max int) (int64, int64, error) { 114 var terr error 115 var readed int64 = 0 116 used, err := DoPerfV(end-beg, max, logf, func(v int) { 117 tp := fmt.Sprintf("%v%v", pref, beg+v) 118 tr, err := f.Read(tp) 119 atomic.AddInt64(&readed, tr) 120 if err != nil { 121 terr = err 122 fmt.Printf("TestMultiR error to (%v) on path(%v) error->%v\n", tp, f.Path, err.Error()) 123 } 124 }) 125 if err == nil { 126 err = terr 127 } 128 return used, readed, err 129 }