forked from TrueCloudLab/restic
255ba83c4b
createRandomIndex was using the global RNG, which locks on every call It was also using twice as many random numbers as necessary and doing a float division in every iteration of the inner loop. BenchmarkDecodeIndex was using too short an input, especially for a parallel version. (It may now be using one that is a bit large.) Results on linux/amd64, -benchtime=3s -count=20: name old time/op new time/op delta PackerManager-8 178ms ± 0% 178ms ± 0% ~ (p=0.165 n=20+20) DecodeIndex-8 13.6µs ± 2% 4539886.8µs ± 0% +33293901.38% (p=0.000 n=20+18) IndexHasUnknown-8 44.4ns ± 7% 44.4ns ± 5% ~ (p=0.873 n=20+19) IndexHasKnown-8 49.2ns ± 3% 48.3ns ± 0% -1.86% (p=0.000 n=20+16) IndexAlloc-8 802ms ± 1% 758ms ± 1% -5.51% (p=0.000 n=20+19) MasterIndexLookupSingleIndex-8 124ns ± 1% 122ns ± 0% -1.41% (p=0.000 n=20+14) MasterIndexLookupMultipleIndex-8 373ns ± 2% 369ns ± 2% -1.13% (p=0.001 n=20+20) MasterIndexLookupSingleIndexUnknown-8 67.8ns ± 3% 68.4ns ± 5% ~ (p=0.753 n=20+20) MasterIndexLookupMultipleIndexUnknown-8 316ns ± 3% 315ns ± 3% ~ (p=0.846 n=20+20) SaveAndEncrypt-8 30.5ms ± 1% 30.2ms ± 1% -1.09% (p=0.000 n=19+19) LoadTree-8 527µs ± 1% 540µs ± 1% +2.37% (p=0.000 n=19+20) LoadBlob-8 5.65ms ± 0% 5.64ms ± 0% -0.21% (p=0.000 n=19+18) LoadAndDecrypt-8 7.07ms ± 2% 5.93ms ± 0% -16.15% (p=0.000 n=19+20) LoadIndex-8 32.1ms ± 2% 25.1ms ± 0% -21.64% (p=0.000 n=20+18) name old speed new speed delta PackerManager-8 296MB/s ± 0% 296MB/s ± 0% ~ (p=0.159 n=20+20) SaveAndEncrypt-8 138MB/s ± 1% 139MB/s ± 1% +1.10% (p=0.000 n=19+19) LoadBlob-8 177MB/s ± 0% 177MB/s ± 0% +0.21% (p=0.000 n=19+18) LoadAndDecrypt-8 141MB/s ± 2% 169MB/s ± 0% +19.24% (p=0.000 n=19+20) name old alloc/op new alloc/op delta PackerManager-8 91.8kB ± 0% 91.8kB ± 0% ~ (p=0.826 n=19+12) IndexAlloc-8 786MB ± 0% 786MB ± 0% +0.01% (p=0.000 n=20+20) SaveAndEncrypt-8 21.0MB ± 0% 21.0MB ± 0% -0.00% (p=0.012 n=20+19) name old allocs/op new allocs/op delta PackerManager-8 1.41k ± 0% 1.41k ± 0% ~ (all equal) IndexAlloc-8 977k ± 0% 977k ± 0% +0.01% (p=0.022 n=20+20) SaveAndEncrypt-8 73.0 ± 0% 73.0 ± 0% ~ (all equal)
158 lines
3.5 KiB
Go
158 lines
3.5 KiB
Go
package repository_test
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"testing"
|
|
|
|
"github.com/restic/restic/internal/repository"
|
|
"github.com/restic/restic/internal/restic"
|
|
rtest "github.com/restic/restic/internal/test"
|
|
)
|
|
|
|
func TestMasterIndexLookup(t *testing.T) {
|
|
idInIdx1 := restic.NewRandomID()
|
|
idInIdx2 := restic.NewRandomID()
|
|
|
|
blob1 := restic.PackedBlob{
|
|
PackID: restic.NewRandomID(),
|
|
Blob: restic.Blob{
|
|
Type: restic.DataBlob,
|
|
ID: idInIdx1,
|
|
Length: 10,
|
|
Offset: 0,
|
|
},
|
|
}
|
|
|
|
blob2 := restic.PackedBlob{
|
|
PackID: restic.NewRandomID(),
|
|
Blob: restic.Blob{
|
|
Type: restic.DataBlob,
|
|
ID: idInIdx2,
|
|
Length: 100,
|
|
Offset: 10,
|
|
},
|
|
}
|
|
|
|
idx1 := repository.NewIndex()
|
|
idx1.Store(blob1)
|
|
|
|
idx2 := repository.NewIndex()
|
|
idx2.Store(blob2)
|
|
|
|
mIdx := repository.NewMasterIndex()
|
|
mIdx.Insert(idx1)
|
|
mIdx.Insert(idx2)
|
|
|
|
blobs, found := mIdx.Lookup(idInIdx1, restic.DataBlob)
|
|
rtest.Assert(t, found, "Expected to find blob id %v from index 1", idInIdx1)
|
|
rtest.Equals(t, []restic.PackedBlob{blob1}, blobs)
|
|
|
|
blobs, found = mIdx.Lookup(idInIdx2, restic.DataBlob)
|
|
rtest.Assert(t, found, "Expected to find blob id %v from index 2", idInIdx2)
|
|
rtest.Equals(t, []restic.PackedBlob{blob2}, blobs)
|
|
|
|
blobs, found = mIdx.Lookup(restic.NewRandomID(), restic.DataBlob)
|
|
rtest.Assert(t, !found, "Expected to not find a blob when fetching with a random id")
|
|
rtest.Assert(t, blobs == nil, "Expected no blobs when fetching with a random id")
|
|
}
|
|
|
|
func BenchmarkMasterIndexLookupSingleIndex(b *testing.B) {
|
|
idx1, lookupID := createRandomIndex(rand.New(rand.NewSource(0)))
|
|
|
|
mIdx := repository.NewMasterIndex()
|
|
mIdx.Insert(idx1)
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
}
|
|
|
|
func BenchmarkMasterIndexLookupMultipleIndex(b *testing.B) {
|
|
rng := rand.New(rand.NewSource(0))
|
|
mIdx := repository.NewMasterIndex()
|
|
|
|
for i := 0; i < 5; i++ {
|
|
idx, _ := createRandomIndex(rng)
|
|
mIdx.Insert(idx)
|
|
}
|
|
|
|
idx1, lookupID := createRandomIndex(rng)
|
|
mIdx.Insert(idx1)
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
}
|
|
|
|
func BenchmarkMasterIndexLookupSingleIndexUnknown(b *testing.B) {
|
|
lookupID := restic.NewRandomID()
|
|
idx1, _ := createRandomIndex(rand.New(rand.NewSource(0)))
|
|
|
|
mIdx := repository.NewMasterIndex()
|
|
mIdx.Insert(idx1)
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
}
|
|
|
|
func BenchmarkMasterIndexLookupMultipleIndexUnknown(b *testing.B) {
|
|
rng := rand.New(rand.NewSource(0))
|
|
lookupID := restic.NewRandomID()
|
|
mIdx := repository.NewMasterIndex()
|
|
|
|
for i := 0; i < 6; i++ {
|
|
idx, _ := createRandomIndex(rng)
|
|
mIdx.Insert(idx)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
}
|
|
|
|
func BenchmarkMasterIndexLookupParallel(b *testing.B) {
|
|
mIdx := repository.NewMasterIndex()
|
|
|
|
for _, numindices := range []int{5, 10, 20} {
|
|
var lookupID restic.ID
|
|
|
|
b.StopTimer()
|
|
rng := rand.New(rand.NewSource(0))
|
|
for i := 0; i < numindices; i++ {
|
|
var idx *repository.Index
|
|
idx, lookupID = createRandomIndex(rng)
|
|
mIdx.Insert(idx)
|
|
}
|
|
b.StartTimer()
|
|
|
|
name := fmt.Sprintf("known,indices=%d", numindices)
|
|
b.Run(name, func(b *testing.B) {
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
})
|
|
})
|
|
|
|
lookupID = restic.NewRandomID()
|
|
name = fmt.Sprintf("unknown,indices=%d", numindices)
|
|
b.Run(name, func(b *testing.B) {
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
mIdx.Lookup(lookupID, restic.DataBlob)
|
|
}
|
|
})
|
|
})
|
|
|
|
}
|
|
}
|