mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
f4fd917e4f
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.
53 lines
1.2 KiB
Go
53 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))
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|