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) + }) + } +}