github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/ledger/complete/checkpoint_benchmark_test.go (about) 1 package complete_test 2 3 import ( 4 "errors" 5 "flag" 6 "fmt" 7 "os" 8 "path/filepath" 9 "strconv" 10 "testing" 11 "time" 12 13 "github.com/rs/zerolog" 14 15 "github.com/onflow/flow-go/ledger/complete/wal" 16 ) 17 18 // To benchmark with local data, using this command: 19 // $ go test -c -o benchmark 20 // $ GOARCH=amd64 GOOS=linux ./benchmark -test.bench=BenchmarkStoreCheckpointV6Concurrently -test.benchmem --checkpointFile ./root.checkpoint 21 var checkpointFile = flag.String("checkpointFile", "", "input checkpoint filename") 22 23 func BenchmarkStoreCheckpointV5(b *testing.B) { 24 benchmarkStoreCheckpoint(b, 5, false) 25 } 26 27 func BenchmarkStoreCheckpointV6(b *testing.B) { 28 benchmarkStoreCheckpoint(b, 6, false) 29 } 30 31 func BenchmarkStoreCheckpointV6Concurrently(b *testing.B) { 32 benchmarkStoreCheckpoint(b, 6, true) 33 } 34 35 func benchmarkStoreCheckpoint(b *testing.B, version int, concurrent bool) { 36 if version != 5 && version != 6 { 37 b.Fatalf("checkpoint file version must be 5 or 6, version %d isn't supported", version) 38 } 39 40 log := zerolog.Nop() 41 42 // Check if checkpoint file exists 43 _, err := os.Stat(*checkpointFile) 44 if errors.Is(err, os.ErrNotExist) { 45 b.Fatalf("input checkpoint file %s doesn't exist", *checkpointFile) 46 } 47 48 dir, fileName := filepath.Split(*checkpointFile) 49 subdir := strconv.FormatInt(time.Now().UnixNano(), 10) 50 outputDir := filepath.Join(dir, subdir) 51 err = os.Mkdir(outputDir, 0755) 52 if err != nil { 53 b.Fatalf("cannot create output dir %s: %s", outputDir, err) 54 } 55 defer func() { 56 // Remove output directory and its contents. 57 os.RemoveAll(outputDir) 58 }() 59 60 // Load checkpoint 61 tries, err := wal.LoadCheckpoint(*checkpointFile, log) 62 if err != nil { 63 b.Fatalf("cannot load checkpoint: %s", err) 64 } 65 66 start := time.Now() 67 b.ResetTimer() 68 69 // Serialize checkpoint V5. 70 switch version { 71 case 5: 72 err = wal.StoreCheckpointV5(outputDir, fileName, log, tries...) 73 case 6: 74 if concurrent { 75 err = wal.StoreCheckpointV6Concurrently(tries, outputDir, fileName, log) 76 } else { 77 err = wal.StoreCheckpointV6SingleThread(tries, outputDir, fileName, log) 78 } 79 } 80 81 b.StopTimer() 82 elapsed := time.Since(start) 83 84 if err != nil { 85 b.Fatalf("cannot store checkpoint: %s", err) 86 } 87 88 b.ReportMetric(float64(elapsed/time.Millisecond), fmt.Sprintf("storecheckpoint_v%d_time_(ms)", version)) 89 b.ReportAllocs() 90 } 91 92 func BenchmarkLoadCheckpoint(b *testing.B) { 93 // Check if input checkpoint file exists 94 _, err := os.Stat(*checkpointFile) 95 if errors.Is(err, os.ErrNotExist) { 96 b.Fatalf("input checkpoint file %s doesn't exist", *checkpointFile) 97 } 98 99 log := zerolog.Nop() 100 101 start := time.Now() 102 b.ResetTimer() 103 104 // Load checkpoint 105 _, err = wal.LoadCheckpoint(*checkpointFile, log) 106 107 b.StopTimer() 108 elapsed := time.Since(start) 109 110 if err != nil { 111 b.Fatalf("cannot load checkpoint : %s", err) 112 } 113 114 b.ReportMetric(float64(elapsed/time.Millisecond), "loadcheckpoint_time_(ms)") 115 b.ReportAllocs() 116 }