VictoriaMetrics/lib/fs/reader_at_timing_test.go
Aliaksandr Valialkin f4fd917e4f lib/fs: replace fs.OpenReaderAt with fs.MustOpenReaderAt
All the callers for fs.OpenReaderAt expect that the file will be opened.
So it is better to log fatal error inside fs.MustOpenReaderAt instead of leaving this to the caller.
2020-11-23 09:57:30 +02:00

54 lines
1.2 KiB
Go

package fs
import (
"fmt"
"io/ioutil"
"testing"
)
func BenchmarkReaderAtMustReadAt(b *testing.B) {
b.Run("mmap_on", func(b *testing.B) {
benchmarkReaderAtMustReadAt(b, true)
})
b.Run("mmap_off", func(b *testing.B) {
benchmarkReaderAtMustReadAt(b, false)
})
}
func benchmarkReaderAtMustReadAt(b *testing.B, isMmap bool) {
prevDisableMmap := *disableMmap
*disableMmap = !isMmap
defer func() {
*disableMmap = prevDisableMmap
}()
path := "BenchmarkReaderAtMustReadAt"
const fileSize = 8 * 1024 * 1024
data := make([]byte, fileSize)
if err := ioutil.WriteFile(path, data, 0600); err != nil {
b.Fatalf("cannot create %q: %s", path, err)
}
defer MustRemoveAll(path)
r := MustOpenReaderAt(path)
defer r.MustClose()
b.ResetTimer()
for _, bufSize := range []int{1, 1e1, 1e2, 1e3, 1e4, 1e5} {
b.Run(fmt.Sprintf("%d", bufSize), func(b *testing.B) {
b.ReportAllocs()
b.SetBytes(int64(bufSize))
b.RunParallel(func(pb *testing.PB) {
buf := make([]byte, bufSize)
var offset int64
for pb.Next() {
if len(buf)+int(offset) > fileSize {
offset = 0
}
r.MustReadAt(buf, offset)
offset += int64(len(buf))
}
})
})
}
}