master
go 121 lines 2.51 KB
Raw
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 }