diff --git a/test/bench/bench_cli_ipfs_add/main.go b/test/bench/bench_cli_ipfs_add/main.go new file mode 100644 index 000000000..484b0d526 --- /dev/null +++ b/test/bench/bench_cli_ipfs_add/main.go @@ -0,0 +1,116 @@ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path" + "testing" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random" + "github.com/jbenet/go-ipfs/repo/config" + "github.com/jbenet/go-ipfs/thirdparty/unit" +) + +var ( + debug = flag.Bool("debug", false, "direct IPFS output to console") + online = flag.Bool("online", false, "run the benchmarks with a running daemon") +) + +func main() { + flag.Parse() + if err := compareResults(); err != nil { + log.Fatal(err) + } +} + +func compareResults() error { + var amount unit.Information + for amount = 10 * unit.MB; amount > 0; amount = amount * 2 { + if results, err := benchmarkAdd(int64(amount)); err != nil { // TODO compare + return err + } else { + log.Println(amount, "\t", results) + } + } + return nil +} + +func benchmarkAdd(amount int64) (*testing.BenchmarkResult, error) { + var benchmarkError error + results := testing.Benchmark(func(b *testing.B) { + b.SetBytes(amount) + for i := 0; i < b.N; i++ { + b.StopTimer() + tmpDir, err := ioutil.TempDir("", "") + if err != nil { + benchmarkError = err + b.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + env := append( + []string{fmt.Sprintf("%s=%s", config.EnvDir, path.Join(tmpDir, ".go-ipfs"))}, // first in order to override + os.Environ()..., + ) + setupCmd := func(cmd *exec.Cmd) { + cmd.Env = env + if *debug { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + } + } + + initCmd := exec.Command("ipfs", "init", "-f", "-b=1024") + setupCmd(initCmd) + if err := initCmd.Run(); err != nil { + benchmarkError = err + b.Fatal(err) + } + + const seed = 1 + f, err := ioutil.TempFile("", "") + if err != nil { + benchmarkError = err + b.Fatal(err) + } + defer os.Remove(f.Name()) + + random.WritePseudoRandomBytes(amount, f, seed) + if err := f.Close(); err != nil { + benchmarkError = err + b.Fatal(err) + } + + func() { + // FIXME online mode isn't working. client complains that it cannot open leveldb + if *online { + daemonCmd := exec.Command("ipfs", "daemon") + setupCmd(daemonCmd) + if err := daemonCmd.Start(); err != nil { + benchmarkError = err + b.Fatal(err) + } + defer daemonCmd.Wait() + defer daemonCmd.Process.Signal(os.Interrupt) + } + + b.StartTimer() + addCmd := exec.Command("ipfs", "add", f.Name()) + setupCmd(addCmd) + if err := addCmd.Run(); err != nil { + benchmarkError = err + b.Fatal(err) + } + b.StopTimer() + }() + } + }) + if benchmarkError != nil { + return nil, benchmarkError + } + return &results, nil +} diff --git a/test/epictest/addcat_test.go b/test/epictest/addcat_test.go index b18c98644..8b3580ed3 100644 --- a/test/epictest/addcat_test.go +++ b/test/epictest/addcat_test.go @@ -15,6 +15,7 @@ import ( coreunix "github.com/jbenet/go-ipfs/core/coreunix" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" "github.com/jbenet/go-ipfs/p2p/peer" + "github.com/jbenet/go-ipfs/thirdparty/unit" errors "github.com/jbenet/go-ipfs/util/debugerror" testutil "github.com/jbenet/go-ipfs/util/testutil" ) @@ -28,7 +29,7 @@ func Test1KBInstantaneous(t *testing.T) { BlockstoreLatency: 0, } - if err := DirectAddCat(RandomBytes(1*KB), conf); err != nil { + if err := DirectAddCat(RandomBytes(1*unit.KB), conf); err != nil { t.Fatal(err) } } diff --git a/test/epictest/bench_test.go b/test/epictest/bench_test.go index 72c82871b..6972cb129 100644 --- a/test/epictest/bench_test.go +++ b/test/epictest/bench_test.go @@ -3,6 +3,7 @@ package epictest import ( "testing" + "github.com/jbenet/go-ipfs/thirdparty/unit" testutil "github.com/jbenet/go-ipfs/util/testutil" ) @@ -22,62 +23,62 @@ func benchmarkAddCat(numBytes int64, conf testutil.LatencyConfig, b *testing.B) var instant = testutil.LatencyConfig{}.All_Instantaneous() -func BenchmarkInstantaneousAddCat1KB(b *testing.B) { benchmarkAddCat(1*KB, instant, b) } -func BenchmarkInstantaneousAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, instant, b) } -func BenchmarkInstantaneousAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, instant, b) } -func BenchmarkInstantaneousAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, instant, b) } -func BenchmarkInstantaneousAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, instant, b) } -func BenchmarkInstantaneousAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, instant, b) } -func BenchmarkInstantaneousAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, instant, b) } -func BenchmarkInstantaneousAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, instant, b) } -func BenchmarkInstantaneousAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, instant, b) } -func BenchmarkInstantaneousAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, instant, b) } +func BenchmarkInstantaneousAddCat1KB(b *testing.B) { benchmarkAddCat(1*unit.KB, instant, b) } +func BenchmarkInstantaneousAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, instant, b) } +func BenchmarkInstantaneousAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, instant, b) } var routing = testutil.LatencyConfig{}.Routing_Slow() -func BenchmarkRoutingSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, routing, b) } -func BenchmarkRoutingSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, routing, b) } -func BenchmarkRoutingSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, routing, b) } -func BenchmarkRoutingSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, routing, b) } -func BenchmarkRoutingSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, routing, b) } -func BenchmarkRoutingSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, routing, b) } -func BenchmarkRoutingSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, routing, b) } -func BenchmarkRoutingSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, routing, b) } -func BenchmarkRoutingSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, routing, b) } -func BenchmarkRoutingSlowAddCat512MB(b *testing.B) { benchmarkAddCat(512*MB, routing, b) } +func BenchmarkRoutingSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, routing, b) } +func BenchmarkRoutingSlowAddCat512MB(b *testing.B) { benchmarkAddCat(512*unit.MB, routing, b) } var network = testutil.LatencyConfig{}.Network_NYtoSF() -func BenchmarkNetworkSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, network, b) } -func BenchmarkNetworkSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, network, b) } -func BenchmarkNetworkSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, network, b) } -func BenchmarkNetworkSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, network, b) } -func BenchmarkNetworkSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, network, b) } -func BenchmarkNetworkSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, network, b) } -func BenchmarkNetworkSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, network, b) } -func BenchmarkNetworkSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, network, b) } -func BenchmarkNetworkSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, network, b) } +func BenchmarkNetworkSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, network, b) } +func BenchmarkNetworkSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, network, b) } var hdd = testutil.LatencyConfig{}.Blockstore_7200RPM() -func BenchmarkBlockstoreSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, hdd, b) } -func BenchmarkBlockstoreSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, hdd, b) } +func BenchmarkBlockstoreSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, hdd, b) } var mixed = testutil.LatencyConfig{}.Network_NYtoSF().Blockstore_SlowSSD2014().Routing_Slow() -func BenchmarkMixedAddCat1MBXX(b *testing.B) { benchmarkAddCat(1*MB, mixed, b) } -func BenchmarkMixedAddCat2MBXX(b *testing.B) { benchmarkAddCat(2*MB, mixed, b) } -func BenchmarkMixedAddCat4MBXX(b *testing.B) { benchmarkAddCat(4*MB, mixed, b) } -func BenchmarkMixedAddCat8MBXX(b *testing.B) { benchmarkAddCat(8*MB, mixed, b) } -func BenchmarkMixedAddCat16MBX(b *testing.B) { benchmarkAddCat(16*MB, mixed, b) } -func BenchmarkMixedAddCat32MBX(b *testing.B) { benchmarkAddCat(32*MB, mixed, b) } -func BenchmarkMixedAddCat64MBX(b *testing.B) { benchmarkAddCat(64*MB, mixed, b) } -func BenchmarkMixedAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, mixed, b) } -func BenchmarkMixedAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, mixed, b) } +func BenchmarkMixedAddCat1MBXX(b *testing.B) { benchmarkAddCat(1*unit.MB, mixed, b) } +func BenchmarkMixedAddCat2MBXX(b *testing.B) { benchmarkAddCat(2*unit.MB, mixed, b) } +func BenchmarkMixedAddCat4MBXX(b *testing.B) { benchmarkAddCat(4*unit.MB, mixed, b) } +func BenchmarkMixedAddCat8MBXX(b *testing.B) { benchmarkAddCat(8*unit.MB, mixed, b) } +func BenchmarkMixedAddCat16MBX(b *testing.B) { benchmarkAddCat(16*unit.MB, mixed, b) } +func BenchmarkMixedAddCat32MBX(b *testing.B) { benchmarkAddCat(32*unit.MB, mixed, b) } +func BenchmarkMixedAddCat64MBX(b *testing.B) { benchmarkAddCat(64*unit.MB, mixed, b) } +func BenchmarkMixedAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, mixed, b) } +func BenchmarkMixedAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, mixed, b) } diff --git a/test/epictest/three_legged_cat_test.go b/test/epictest/three_legged_cat_test.go index 2926abb7a..2f7daaf97 100644 --- a/test/epictest/three_legged_cat_test.go +++ b/test/epictest/three_legged_cat_test.go @@ -11,6 +11,7 @@ import ( coreunix "github.com/jbenet/go-ipfs/core/coreunix" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" "github.com/jbenet/go-ipfs/p2p/peer" + "github.com/jbenet/go-ipfs/thirdparty/unit" errors "github.com/jbenet/go-ipfs/util/debugerror" testutil "github.com/jbenet/go-ipfs/util/testutil" ) @@ -21,7 +22,7 @@ func TestThreeLeggedCat(t *testing.T) { RoutingLatency: 0, BlockstoreLatency: 0, } - if err := RunThreeLeggedCat(RandomBytes(1*KB), conf); err != nil { + if err := RunThreeLeggedCat(RandomBytes(1*unit.KB), conf); err != nil { t.Fatal(err) } } diff --git a/test/epictest/unit.go b/test/epictest/unit.go index 83a366181..619ed8ae4 100644 --- a/test/epictest/unit.go +++ b/test/epictest/unit.go @@ -1,11 +1 @@ package epictest - -const ( - _ = iota // ignore first value by assigning to blank identifier - KB = 1 << (10 * iota) - MB - GB - TB - PB - EB -) diff --git a/test/epictest/unit_test.go b/test/epictest/unit_test.go index 96cd3096e..3324db476 100644 --- a/test/epictest/unit_test.go +++ b/test/epictest/unit_test.go @@ -1,26 +1,2 @@ package epictest -import "testing" - -// and the award for most meta goes to... - -func TestByteSizeUnit(t *testing.T) { - if 1*KB != 1*1024 { - t.Fatal(1 * KB) - } - if 1*MB != 1*1024*1024 { - t.Fail() - } - if 1*GB != 1*1024*1024*1024 { - t.Fail() - } - if 1*TB != 1*1024*1024*1024*1024 { - t.Fail() - } - if 1*PB != 1*1024*1024*1024*1024*1024 { - t.Fail() - } - if 1*EB != 1*1024*1024*1024*1024*1024*1024 { - t.Fail() - } -} diff --git a/thirdparty/unit/unit.go b/thirdparty/unit/unit.go new file mode 100644 index 000000000..866beea51 --- /dev/null +++ b/thirdparty/unit/unit.go @@ -0,0 +1,46 @@ +package unit + +import "fmt" + +type Information int64 + +const ( + _ Information = iota // ignore first value by assigning to blank identifier + KB = 1 << (10 * iota) + MB + GB + TB + PB + EB +) + +func (i Information) String() string { + + tmp := int64(i) + + // default + var d int64 = tmp + symbol := "B" + + switch { + case i > EB: + d = tmp / EB + symbol = "EB" + case i > PB: + d = tmp / PB + symbol = "PB" + case i > TB: + d = tmp / TB + symbol = "TB" + case i > GB: + d = tmp / GB + symbol = "GB" + case i > MB: + d = tmp / MB + symbol = "MB" + case i > KB: + d = tmp / KB + symbol = "KB" + } + return fmt.Sprintf("%d %s", d, symbol) +} diff --git a/thirdparty/unit/unit_test.go b/thirdparty/unit/unit_test.go new file mode 100644 index 000000000..9712257d1 --- /dev/null +++ b/thirdparty/unit/unit_test.go @@ -0,0 +1,26 @@ +package unit + +import "testing" + +// and the award for most meta goes to... + +func TestByteSizeUnit(t *testing.T) { + if 1*KB != 1*1024 { + t.Fatal(1 * KB) + } + if 1*MB != 1*1024*1024 { + t.Fail() + } + if 1*GB != 1*1024*1024*1024 { + t.Fail() + } + if 1*TB != 1*1024*1024*1024*1024 { + t.Fail() + } + if 1*PB != 1*1024*1024*1024*1024*1024 { + t.Fail() + } + if 1*EB != 1*1024*1024*1024*1024*1024*1024 { + t.Fail() + } +}