From bed02e983898b3401ee3338d1cedd5cf0a3f0dcb Mon Sep 17 00:00:00 2001 From: Sebastian Zagrodzki Date: Wed, 1 Mar 2017 10:51:17 +0100 Subject: [PATCH] A benchmark on the trivial cgo call, to assess overhead of different ways of calling out to cgo. --- usb/libusb.go | 5 ++++ usb/libusb_cgo_benchmark_test.go | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 usb/libusb_cgo_benchmark_test.go diff --git a/usb/libusb.go b/usb/libusb.go index b708fb6..2c2f231 100644 --- a/usb/libusb.go +++ b/usb/libusb.go @@ -381,3 +381,8 @@ func xfer_callback(cptr unsafe.Pointer) { ch := *(*chan struct{})(cptr) close(ch) } + +// for benchmarking +func libusbSetDebug(c *libusbContext, lvl int) { + C.libusb_set_debug((*C.libusb_context)(c), C.int(lvl)) +} diff --git a/usb/libusb_cgo_benchmark_test.go b/usb/libusb_cgo_benchmark_test.go new file mode 100644 index 0000000..da8acc9 --- /dev/null +++ b/usb/libusb_cgo_benchmark_test.go @@ -0,0 +1,46 @@ +package usb + +import "testing" + +func BenchmarkCGo(b *testing.B) { + for _, bc := range []struct { + name string + bfunc func(*libusbContext, int) + }{ + { + name: "simple function", + bfunc: func(ctx *libusbContext, N int) { + for i := 0; i < N; i++ { + libusbSetDebug(ctx, i&1) + } + }, + }, + { + name: "method", + bfunc: func(ctx *libusbContext, N int) { + impl := libusbImpl{} + for i := 0; i < N; i++ { + impl.setDebug(ctx, i&1) + } + }, + }, + { + name: "interface", + bfunc: func(ctx *libusbContext, N int) { + var intf libusbIntf = libusbImpl{} + for i := 0; i < N; i++ { + intf.setDebug(ctx, i&1) + } + }, + }, + } { + b.Run(bc.name, func(b *testing.B) { + ctx, err := libusbImpl{}.init() + if err != nil { + b.Fatalf("libusb_init() failed: %v", err) + } + b.ResetTimer() + bc.bfunc(ctx, b.N) + }) + } +}