diff --git a/lib/db/benchmark_test.go b/lib/db/benchmark_test.go index 746962a9..695fdd05 100644 --- a/lib/db/benchmark_test.go +++ b/lib/db/benchmark_test.go @@ -8,9 +8,6 @@ package db_test import ( "fmt" - "io/ioutil" - "os" - "path/filepath" "testing" "github.com/syncthing/syncthing/lib/db" @@ -39,30 +36,15 @@ func lazyInitBenchFileSet() { secondHalf = files[middle:] oneFile = firstHalf[middle-1 : middle] - ldb, _ := tempDB() + ldb := db.OpenMemory() benchS = db.NewFileSet("test)", fs.NewFilesystem(fs.FilesystemTypeBasic, "."), ldb) replace(benchS, remoteDevice0, files) replace(benchS, protocol.LocalDeviceID, firstHalf) } -func tempDB() (*db.Lowlevel, string) { - dir, err := ioutil.TempDir("", "syncthing") - if err != nil { - panic(err) - } - dbi, err := db.Open(filepath.Join(dir, "db")) - if err != nil { - panic(err) - } - return dbi, dir -} - func BenchmarkReplaceAll(b *testing.B) { - ldb, dir := tempDB() - defer func() { - ldb.Close() - os.RemoveAll(dir) - }() + ldb := db.OpenMemory() + defer ldb.Close() b.ResetTimer() for i := 0; i < b.N; i++ { @@ -78,12 +60,11 @@ func BenchmarkUpdateOneChanged(b *testing.B) { changed := make([]protocol.FileInfo, 1) changed[0] = oneFile[0] - changed[0].Version = changed[0].Version.Update(myID) - changed[0].Blocks = genBlocks(len(changed[0].Blocks)) + changed[0].Version = changed[0].Version.Copy().Update(myID) b.ResetTimer() for i := 0; i < b.N; i++ { - if i%1 == 0 { + if i%2 == 0 { benchS.Update(protocol.LocalDeviceID, changed) } else { benchS.Update(protocol.LocalDeviceID, oneFile) @@ -93,6 +74,48 @@ func BenchmarkUpdateOneChanged(b *testing.B) { b.ReportAllocs() } +func BenchmarkUpdate100Changed(b *testing.B) { + lazyInitBenchFileSet() + + unchanged := files[100:200] + changed := append([]protocol.FileInfo{}, unchanged...) + for i := range changed { + changed[i].Version = changed[i].Version.Copy().Update(myID) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if i%2 == 0 { + benchS.Update(protocol.LocalDeviceID, changed) + } else { + benchS.Update(protocol.LocalDeviceID, unchanged) + } + } + + b.ReportAllocs() +} + +func BenchmarkUpdate100ChangedRemote(b *testing.B) { + lazyInitBenchFileSet() + + unchanged := files[100:200] + changed := append([]protocol.FileInfo{}, unchanged...) + for i := range changed { + changed[i].Version = changed[i].Version.Copy().Update(myID) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if i%2 == 0 { + benchS.Update(remoteDevice0, changed) + } else { + benchS.Update(remoteDevice0, unchanged) + } + } + + b.ReportAllocs() +} + func BenchmarkUpdateOneUnchanged(b *testing.B) { lazyInitBenchFileSet() @@ -122,6 +145,30 @@ func BenchmarkNeedHalf(b *testing.B) { b.ReportAllocs() } +func BenchmarkNeedHalfRemote(b *testing.B) { + lazyInitBenchFileSet() + + ldb := db.OpenMemory() + defer ldb.Close() + fset := db.NewFileSet("test)", fs.NewFilesystem(fs.FilesystemTypeBasic, "."), ldb) + replace(fset, remoteDevice0, firstHalf) + replace(fset, protocol.LocalDeviceID, files) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + count := 0 + fset.WithNeed(remoteDevice0, func(fi db.FileIntf) bool { + count++ + return true + }) + if count != len(secondHalf) { + b.Errorf("wrong length %d != %d", count, len(secondHalf)) + } + } + + b.ReportAllocs() +} + func BenchmarkHave(b *testing.B) { lazyInitBenchFileSet()