diff options
author | Ondrej Fabry <ofabry@cisco.com> | 2019-02-08 01:16:32 +0100 |
---|---|---|
committer | Ondrej Fabry <ofabry@cisco.com> | 2019-02-08 01:16:32 +0100 |
commit | fa21c9d726ebb807895a8571af9a16dab5cd8d6e (patch) | |
tree | 4597d483f90e374e89f3923324b531a56217a0f9 /examples/perf-bench | |
parent | 8ba70a7b13950593aab9863246f830eda450f06b (diff) |
Generator improvements and cleanup
- generator now supports include-comments flag (as opt-in)
- minor code cleanup in binapi-generator
- remove obsolete unit tests
- flatten examples from examples/cmd folder
- introduce constant for checking compatibility in future versions
Change-Id: I3545f2ba4b869a3b51d6d0de7e742f3f1e1be392
Signed-off-by: Ondrej Fabry <ofabry@cisco.com>
Diffstat (limited to 'examples/perf-bench')
-rw-r--r-- | examples/perf-bench/perf-bench.go | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/examples/perf-bench/perf-bench.go b/examples/perf-bench/perf-bench.go new file mode 100644 index 0000000..24d3ebb --- /dev/null +++ b/examples/perf-bench/perf-bench.go @@ -0,0 +1,126 @@ +// Copyright (c) 2017 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary simple-client is an example VPP management application that exercises the +// govpp API on real-world use-cases. +package main + +import ( + "flag" + "fmt" + "log" + "time" + + "github.com/pkg/profile" + "github.com/sirupsen/logrus" + + "git.fd.io/govpp.git" + "git.fd.io/govpp.git/api" + "git.fd.io/govpp.git/core" + "git.fd.io/govpp.git/examples/bin_api/vpe" +) + +const ( + defaultSyncRequestCount = 1000 + defaultAsyncRequestCount = 10000 +) + +func main() { + // parse optional flags + var sync, prof bool + var cnt int + flag.BoolVar(&sync, "sync", false, "run synchronous perf test") + flag.IntVar(&cnt, "count", 0, "count of requests to be sent to VPP") + flag.BoolVar(&prof, "prof", false, "generate profile data") + flag.Parse() + + if cnt == 0 { + // no specific count defined - use defaults + if sync { + cnt = defaultSyncRequestCount + } else { + cnt = defaultAsyncRequestCount + } + } + + if prof { + defer profile.Start().Stop() + } + + // connect to VPP + conn, err := govpp.Connect("") + if err != nil { + log.Fatalln("Error:", err) + } + defer conn.Disconnect() + + // create an API channel + ch, err := conn.NewAPIChannelBuffered(cnt, cnt) + if err != nil { + log.Fatalln("Error:", err) + } + defer ch.Close() + + // log only errors + core.SetLogger(&logrus.Logger{Level: logrus.ErrorLevel}) + + // run the test & measure the time + start := time.Now() + + if sync { + // run synchronous test + syncTest(ch, cnt) + } else { + // run asynchronous test + asyncTest(ch, cnt) + } + + elapsed := time.Since(start) + fmt.Println("Test took:", elapsed) + fmt.Printf("Requests per second: %.0f\n", float64(cnt)/elapsed.Seconds()) +} + +func syncTest(ch api.Channel, cnt int) { + fmt.Printf("Running synchronous perf test with %d requests...\n", cnt) + + for i := 0; i < cnt; i++ { + req := &vpe.ControlPing{} + reply := &vpe.ControlPingReply{} + + if err := ch.SendRequest(req).ReceiveReply(reply); err != nil { + log.Fatalln("Error in reply:", err) + } + } +} + +func asyncTest(ch api.Channel, cnt int) { + fmt.Printf("Running asynchronous perf test with %d requests...\n", cnt) + + ctxChan := make(chan api.RequestCtx, cnt) + + go func() { + for i := 0; i < cnt; i++ { + ctxChan <- ch.SendRequest(&vpe.ControlPing{}) + } + close(ctxChan) + fmt.Printf("Sending asynchronous requests finished\n") + }() + + for ctx := range ctxChan { + reply := &vpe.ControlPingReply{} + if err := ctx.ReceiveReply(reply); err != nil { + log.Fatalln("Error in reply:", err) + } + } +} |