aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2021-09-05 12:17:38 +0200
committerJakob Unterwurzacher2021-09-07 18:14:05 +0200
commit6a0206897c83e1f3e4539d6a6c77149167f49626 (patch)
tree595bd444c56beaa2c405a9ba518acf852e06c70e
parenta2eaa5e3d1d9dfd8cf840076c215d253f82abf4b (diff)
stupidgcm: add BenchmarkCCall
gocryptfs/internal/stupidgcm$ go test -bench . goos: linux goarch: amd64 pkg: github.com/rfjakob/gocryptfs/v2/internal/stupidgcm cpu: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz BenchmarkCCall-4 15864030 78.60 ns/op PASS ok github.com/rfjakob/gocryptfs/v2/internal/stupidgcm 1.898s
-rw-r--r--internal/stupidgcm/common_test.go21
-rw-r--r--internal/stupidgcm/openssl.go6
-rw-r--r--internal/stupidgcm/openssl_aead.c5
-rw-r--r--internal/stupidgcm/openssl_aead.h2
4 files changed, 34 insertions, 0 deletions
diff --git a/internal/stupidgcm/common_test.go b/internal/stupidgcm/common_test.go
index a8080ca..589d974 100644
--- a/internal/stupidgcm/common_test.go
+++ b/internal/stupidgcm/common_test.go
@@ -208,3 +208,24 @@ func randBytes(n int) []byte {
}
return b
}
+
+/*
+BenchmarkCCall benchmarks the overhead of calling from Go into C.
+Looks like things improved a bit compared to
+https://www.cockroachlabs.com/blog/the-cost-and-complexity-of-cgo/
+where they measured 171ns/op:
+
+$ go test -bench .
+goos: linux
+goarch: amd64
+pkg: github.com/rfjakob/gocryptfs/v2/internal/stupidgcm
+cpu: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
+BenchmarkCCall-4 13989364 76.72 ns/op
+PASS
+ok github.com/rfjakob/gocryptfs/v2/internal/stupidgcm 1.735s
+*/
+func BenchmarkCCall(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ noopCFunction()
+ }
+}
diff --git a/internal/stupidgcm/openssl.go b/internal/stupidgcm/openssl.go
index cb9845e..82ec0a1 100644
--- a/internal/stupidgcm/openssl.go
+++ b/internal/stupidgcm/openssl.go
@@ -108,3 +108,9 @@ func openSSLOpen(a *stupidAEADCommon, dst, iv, in, authData []byte) ([]byte, err
}
return append(dst, buf...), nil
}
+
+// This functions exists to benchmark the C call overhead from Go.
+// See BenchmarkCCall for resuts.
+func noopCFunction() {
+ C.noop_c_function()
+}
diff --git a/internal/stupidgcm/openssl_aead.c b/internal/stupidgcm/openssl_aead.c
index 9dc6866..77898d5 100644
--- a/internal/stupidgcm/openssl_aead.c
+++ b/internal/stupidgcm/openssl_aead.c
@@ -176,3 +176,8 @@ int openssl_aead_open(
return plaintextLen;
}
+
+// This functions exists to benchmark the C call overhead from Go.
+void noop_c_function(void) {
+ return;
+}
diff --git a/internal/stupidgcm/openssl_aead.h b/internal/stupidgcm/openssl_aead.h
index 6a818b6..820beeb 100644
--- a/internal/stupidgcm/openssl_aead.h
+++ b/internal/stupidgcm/openssl_aead.h
@@ -27,3 +27,5 @@ int openssl_aead_open(
const int ivLen,
unsigned char* const plaintext,
const int plaintextBufLen);
+
+void noop_c_function(void);