@cryptotaxi247 / kubo / commits / a58515ffb

add benchmark for ipfs add CLI

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