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  }