| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "flag" |
| 5 | "fmt" |
| 6 | "io" |
| 7 | "log" |
| 8 | "os" |
| 9 | "os/exec" |
| 10 | "path" |
| 11 | "testing" |
| 12 | |
| 13 | "github.com/ipfs/kubo/thirdparty/unit" |
| 14 | |
| 15 | random "github.com/ipfs/go-test/random" |
| 16 | config "github.com/ipfs/kubo/config" |
| 17 | ) |
| 18 | |
| 19 | var ( |
| 20 | debug = flag.Bool("debug", false, "direct ipfs output to console") |
| 21 | online = flag.Bool("online", false, "run the benchmarks with a running daemon") |
| 22 | ) |
| 23 | |
| 24 | func main() { |
| 25 | flag.Parse() |
| 26 | if err := compareResults(); err != nil { |
| 27 | log.Fatal(err) |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | func compareResults() error { |
| 32 | var amount unit.Information |
| 33 | for amount = 10 * unit.MB; amount > 0; amount = amount * 2 { |
| 34 | if results, err := benchmarkAdd(int64(amount)); err != nil { // TODO compare |
| 35 | return err |
| 36 | } else { |
| 37 | log.Println(amount, "\t", results) |
| 38 | } |
| 39 | } |
| 40 | return nil |
| 41 | } |
| 42 | |
| 43 | func benchmarkAdd(amount int64) (*testing.BenchmarkResult, error) { |
| 44 | var benchmarkError error |
| 45 | results := testing.Benchmark(func(b *testing.B) { |
| 46 | b.SetBytes(amount) |
| 47 | for i := 0; i < b.N; i++ { |
| 48 | b.StopTimer() |
| 49 | tmpDir := b.TempDir() |
| 50 | |
| 51 | env := append( |
| 52 | []string{fmt.Sprintf("%s=%s", config.EnvDir, path.Join(tmpDir, config.DefaultPathName))}, // first in order to override |
| 53 | os.Environ()..., |
| 54 | ) |
| 55 | setupCmd := func(cmd *exec.Cmd) { |
| 56 | cmd.Env = env |
| 57 | if *debug { |
| 58 | cmd.Stdout = os.Stdout |
| 59 | cmd.Stderr = os.Stderr |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | initCmd := exec.Command("ipfs", "init") |
| 64 | setupCmd(initCmd) |
| 65 | if err := initCmd.Run(); err != nil { |
| 66 | benchmarkError = err |
| 67 | b.Fatal(err) |
| 68 | } |
| 69 | |
| 70 | const seed = 1 |
| 71 | f, err := os.CreateTemp("", "") |
| 72 | if err != nil { |
| 73 | benchmarkError = err |
| 74 | b.Fatal(err) |
| 75 | } |
| 76 | defer os.Remove(f.Name()) |
| 77 | |
| 78 | randReader := &io.LimitedReader{ |
| 79 | R: random.NewSeededRand(seed), |
| 80 | N: amount, |
| 81 | } |
| 82 | if _, err := io.Copy(f, randReader); err != nil { |
| 83 | benchmarkError = err |
| 84 | b.Fatal(err) |
| 85 | } |
| 86 | if err := f.Close(); err != nil { |
| 87 | benchmarkError = err |
| 88 | b.Fatal(err) |
| 89 | } |
| 90 | |
| 91 | func() { |
| 92 | // FIXME online mode isn't working. client complains that it cannot open leveldb |
| 93 | if *online { |
| 94 | daemonCmd := exec.Command("ipfs", "daemon") |
| 95 | setupCmd(daemonCmd) |
| 96 | if err := daemonCmd.Start(); err != nil { |
| 97 | benchmarkError = err |
| 98 | b.Fatal(err) |
| 99 | } |
| 100 | defer func() { |
| 101 | _ = daemonCmd.Process.Signal(os.Interrupt) |
| 102 | _ = daemonCmd.Wait() |
| 103 | }() |
| 104 | } |
| 105 | |
| 106 | b.StartTimer() |
| 107 | addCmd := exec.Command("ipfs", "add", f.Name()) |
| 108 | setupCmd(addCmd) |
| 109 | if err := addCmd.Run(); err != nil { |
| 110 | benchmarkError = err |
| 111 | b.Fatal(err) |
| 112 | } |
| 113 | b.StopTimer() |
| 114 | }() |
| 115 | } |
| 116 | }) |
| 117 | if benchmarkError != nil { |
| 118 | return nil, benchmarkError |
| 119 | } |
| 120 | return &results, nil |
| 121 | } |