github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/cmd/mount/test/seek_speed.go (about) 1 // +build ignore 2 3 // Read blocks out of a single file to time the seeking code 4 package main 5 6 import ( 7 "flag" 8 "io" 9 "log" 10 "math/rand" 11 "os" 12 "time" 13 ) 14 15 var ( 16 // Flags 17 iterations = flag.Int("n", 25, "Iterations to try") 18 maxBlockSize = flag.Int("b", 1024*1024, "Max block size to read") 19 randSeed = flag.Int64("seed", 1, "Seed for the random number generator") 20 ) 21 22 func randomSeekTest(size int64, in *os.File, name string) { 23 startTime := time.Now() 24 start := rand.Int63n(size) 25 blockSize := rand.Intn(*maxBlockSize) 26 if int64(blockSize) > size-start { 27 blockSize = int(size - start) 28 } 29 30 _, err := in.Seek(start, io.SeekStart) 31 if err != nil { 32 log.Fatalf("Seek failed on %q: %v", name, err) 33 } 34 35 buf := make([]byte, blockSize) 36 _, err = io.ReadFull(in, buf) 37 if err != nil { 38 log.Fatalf("Read failed on %q: %v", name, err) 39 } 40 41 log.Printf("Reading %d from %d took %v ", blockSize, start, time.Since(startTime)) 42 } 43 44 func main() { 45 flag.Parse() 46 args := flag.Args() 47 if len(args) != 1 { 48 log.Fatalf("Require 1 file as argument") 49 } 50 rand.Seed(*randSeed) 51 52 name := args[0] 53 openStart := time.Now() 54 in, err := os.Open(name) 55 if err != nil { 56 log.Fatalf("Couldn't open %q: %v", name, err) 57 } 58 log.Printf("File Open took %v", time.Since(openStart)) 59 60 fi, err := in.Stat() 61 if err != nil { 62 log.Fatalf("Couldn't stat %q: %v", name, err) 63 } 64 65 start := time.Now() 66 for i := 0; i < *iterations; i++ { 67 randomSeekTest(fi.Size(), in, name) 68 } 69 dt := time.Since(start) 70 log.Printf("That took %v for %d iterations, %v per iteration", dt, *iterations, dt/time.Duration(*iterations)) 71 72 err = in.Close() 73 if err != nil { 74 log.Fatalf("Error closing %q: %v", name, err) 75 } 76 }