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  }