Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,24 @@ lint:
build:
go build -v ./...

.PHONY: bench bench-publish bench-consume bench-get bench-multi
.PHONY: bench bench-publish bench-consume bench-get bench-multi bench-keys
bench:
go test -bench=. -benchmem -run XXX

bench-publish:
go test -bench=BenchmarkSingle/Publish -benchmem -run XXX
go test -bench=BenchmarkSingle/Publish/V2 -benchmem -run XXX

bench-consume:
go test -bench=BenchmarkSingle/Consume -benchmem -run XXX
go test -bench=BenchmarkSingle/Consume/V2 -benchmem -run XXX

bench-get:
go test -bench=BenchmarkSingle/Get -benchmem -run XXX
go test -bench=BenchmarkSingle/Get/V2 -benchmem -run XXX

bench-multi:
go test -bench=BenchmarkMulti -benchmem -run XXX
go test -bench=BenchmarkMulti/V2 -benchmem -run XXX

bench-keys:
go test -bench=BenchmarkKeys -benchmem -run XXX

.PHONY: update-libs
update-libs:
Expand Down
258 changes: 145 additions & 113 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ func BenchmarkMulti(b *testing.B) {
})
}

func BenchmarkKeys(b *testing.B) {
opts := Options{KeyIndex: true, Version: v2opts}
b.Run("Publish", func(b *testing.B) { benchmarkPublishOptions(b, 8, opts) })
b.Run("Consume/W", func(b *testing.B) { benchmarkConsumeOptionsW(b, 8, opts) })
b.Run("Consume/R", func(b *testing.B) { benchmarkConsumeOptionsR(b, 8, opts) })
b.Run("ByKey/W", func(b *testing.B) { benchmarkGetKeyW(b, v2opts) })
b.Run("ByKey/A", func(b *testing.B) { benchmarkGetKeyA(b, v2opts) })
}

func MkdirBench(b *testing.B) string {
name := strings.ReplaceAll(b.Name(), "/", "_")

Expand All @@ -73,30 +82,34 @@ func benchmarkPublish(b *testing.B, version VersionOptions) {
for _, bn := range []int{1, 8} {
for _, c := range cases {
b.Run(fmt.Sprintf("%d/%s", bn, c.name), func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
benchmarkPublishOptions(b, bn, c.opts)
})
}
}
}

s, err := Open(dir, c.opts)
require.NoError(b, err)
defer s.Close()
func benchmarkPublishOptions(b *testing.B, bn int, opts Options) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

msgs := message.Gen(b.N)
s, err := Open(dir, opts)
require.NoError(b, err)
defer s.Close()

b.SetBytes(s.Size(msgs[0]) * int64(bn))
b.ResetTimer()
msgs := message.Gen(b.N)

for i := 0; i < b.N; i += bn {
top := min(i+bn, b.N)
b.SetBytes(s.Size(msgs[0]) * int64(bn))
b.ResetTimer()

if _, err := s.Publish(msgs[i:top]); err != nil {
b.Fatal(err)
}
}
for i := 0; i < b.N; i += bn {
top := min(i+bn, b.N)

b.StopTimer()
})
if _, err := s.Publish(msgs[i:top]); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
}

func benchmarkPublishMulti(b *testing.B, version VersionOptions) {
Expand Down Expand Up @@ -153,84 +166,95 @@ func benchmarkConsume(b *testing.B, version VersionOptions) {
for _, bn := range []int{1, 8} {
for _, c := range cases {
b.Run(fmt.Sprintf("W/%s/%d", c.name, bn), func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
benchmarkConsumeOptionsW(b, bn, c.opts)
})

l, err := Open(dir, c.opts)
require.NoError(b, err)
defer l.Close()
b.Run(fmt.Sprintf("A/%s/%d", c.name, bn), func(b *testing.B) {
benchmarkConsumeOptionsA(b, bn, c.opts)
})

msgs := fillLog(b, l)
b.Run(fmt.Sprintf("R/%s/%d", c.name, bn), func(b *testing.B) {
benchmarkConsumeOptionsR(b, bn, c.opts)
})
}
}
}

b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()
func benchmarkConsumeOptionsW(b *testing.B, bn int, opts Options) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}
l, err := Open(dir, opts)
require.NoError(b, err)
defer l.Close()

b.StopTimer()
})
msgs := fillLog(b, l)

b.Run(fmt.Sprintf("A/%s/%d", c.name, bn), func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()

for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}

l, err := Open(dir, c.opts)
require.NoError(b, err)
defer l.Close()
b.StopTimer()
}

msgs := fillLog(b, l)
require.NoError(b, l.Close())
func benchmarkConsumeOptionsA(b *testing.B, bn int, opts Options) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()
l, err := Open(dir, opts)
require.NoError(b, err)
defer l.Close()

l, err = Open(dir, c.opts)
require.NoError(b, err)
defer l.Close()
msgs := fillLog(b, l)
require.NoError(b, l.Close())

for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}
b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()

b.StopTimer()
})
l, err = Open(dir, opts)
require.NoError(b, err)
defer l.Close()

b.Run(fmt.Sprintf("R/%s/%d", c.name, bn), func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}

l, err := Open(dir, c.opts)
require.NoError(b, err)
defer l.Close()
b.StopTimer()
}

msgs := fillLog(b, l)
require.NoError(b, l.Close())
func benchmarkConsumeOptionsR(b *testing.B, bn int, opts Options) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()
l, err := Open(dir, opts)
require.NoError(b, err)
defer l.Close()

opts := c.opts
opts.Readonly = true
l, err = Open(dir, opts)
require.NoError(b, err)
defer l.Close()
msgs := fillLog(b, l)
require.NoError(b, l.Close())

for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}
b.SetBytes(l.Size(msgs[0]) * int64(bn))
b.ResetTimer()

b.StopTimer()
})
opts.Readonly = true
l, err = Open(dir, opts)
require.NoError(b, err)
defer l.Close()

for i := 0; i < b.N; i += bn {
if _, _, err := l.Consume(int64(i), int64(bn)); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
}

func benchmarkConsumeMulti(b *testing.B, version VersionOptions) {
Expand Down Expand Up @@ -291,10 +315,18 @@ func benchmarkGet(b *testing.B, version VersionOptions) {
})

b.Run("ByKey/W", func(b *testing.B) {
benchmarkGetKeyW(b, version)
})

b.Run("ByKey/A", func(b *testing.B) {
benchmarkGetKeyA(b, version)
})

b.Run("ByTime/W", func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

l, err := Open(dir, Options{KeyIndex: true, Version: version})
l, err := Open(dir, Options{TimeIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()

Expand All @@ -304,19 +336,19 @@ func benchmarkGet(b *testing.B, version VersionOptions) {
b.ResetTimer()

for i := 0; i < b.N; i++ {
if _, err := l.GetByKey(msgs[i].Key); err != nil {
if _, err := l.GetByTime(msgs[i].Time); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
})

b.Run("ByKey/A", func(b *testing.B) {
b.Run("ByTime/A", func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

l, err := Open(dir, Options{KeyIndex: true, Version: version})
l, err := Open(dir, Options{TimeIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()

Expand All @@ -326,67 +358,67 @@ func benchmarkGet(b *testing.B, version VersionOptions) {
b.SetBytes(l.Size(msgs[0]))
b.ResetTimer()

l, err = Open(dir, Options{KeyIndex: true, Readonly: true, Version: version})
l, err = Open(dir, Options{TimeIndex: true, Readonly: true, Version: version})
require.NoError(b, err)
defer l.Close()

for i := 0; i < b.N; i++ {
if _, err := l.GetByKey(msgs[i].Key); err != nil {
if _, err := l.GetByTime(msgs[i].Time); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
})
}

b.Run("ByTime/W", func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
func benchmarkGetKeyW(b *testing.B, version VersionOptions) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

l, err := Open(dir, Options{TimeIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()
l, err := Open(dir, Options{KeyIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()

msgs := fillLog(b, l)
msgs := fillLog(b, l)

b.SetBytes(l.Size(msgs[0]))
b.ResetTimer()
b.SetBytes(l.Size(msgs[0]))
b.ResetTimer()

for i := 0; i < b.N; i++ {
if _, err := l.GetByTime(msgs[i].Time); err != nil {
b.Fatal(err)
}
for i := 0; i < b.N; i++ {
if _, err := l.GetByKey(msgs[i].Key); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
})
b.StopTimer()
}

b.Run("ByTime/A", func(b *testing.B) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)
func benchmarkGetKeyA(b *testing.B, version VersionOptions) {
dir := MkdirBench(b)
defer os.RemoveAll(dir)

l, err := Open(dir, Options{TimeIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()
l, err := Open(dir, Options{KeyIndex: true, Version: version})
require.NoError(b, err)
defer l.Close()

msgs := fillLog(b, l)
require.NoError(b, l.Close())
msgs := fillLog(b, l)
require.NoError(b, l.Close())

b.SetBytes(l.Size(msgs[0]))
b.ResetTimer()
b.SetBytes(l.Size(msgs[0]))
b.ResetTimer()

l, err = Open(dir, Options{TimeIndex: true, Readonly: true, Version: version})
require.NoError(b, err)
defer l.Close()
l, err = Open(dir, Options{KeyIndex: true, Readonly: true, Version: version})
require.NoError(b, err)
defer l.Close()

for i := 0; i < b.N; i++ {
if _, err := l.GetByTime(msgs[i].Time); err != nil {
b.Fatal(err)
}
for i := 0; i < b.N; i++ {
if _, err := l.GetByKey(msgs[i].Key); err != nil {
b.Fatal(err)
}
}

b.StopTimer()
})
b.StopTimer()
}

func benchmarkGetKeyMulti(b *testing.B, version VersionOptions) {
Expand Down
Loading
Loading