aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2021-09-14 18:47:41 +0200
committerJakob Unterwurzacher2021-09-14 18:58:22 +0200
commit2d0ba24ecab375f276f024bc014faad9a7ef169c (patch)
tree53d2c219c7e5135561c1e4a1fd7e4d56777d77ee
parent61e37b2439f0b8a7c16458e73cb57c7428fe61f2 (diff)
-speed: print cpu model
When somebody posts "gocryptfs -speed" results, they are most helpful together with the CPU model. Add the cpu model to the output. Example: $ ./gocryptfs -speed gocryptfs v2.2.0-beta1-5-g52b0444-dirty; go-fuse v2.1.1-0.20210825171523-3ab5d95a30ae; 2021-09-14 go1.17.1 linux/amd64 cpu: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz; with AES acceleration AES-GCM-256-OpenSSL 862.79 MB/s AES-GCM-256-Go 997.71 MB/s (selected in auto mode) AES-SIV-512-Go 159.58 MB/s XChaCha20-Poly1305-OpenSSL 729.65 MB/s XChaCha20-Poly1305-Go 843.97 MB/s (selected in auto mode)
-rw-r--r--README.md13
-rw-r--r--internal/speed/cpuinfo.go54
-rw-r--r--internal/speed/speed.go10
3 files changed, 71 insertions, 6 deletions
diff --git a/README.md b/README.md
index e4ea9a7..69a3416 100644
--- a/README.md
+++ b/README.md
@@ -168,12 +168,13 @@ Example for a CPU with AES-NI:
```
$ ./gocryptfs -speed
-gocryptfs v2.2.0-beta1-4-gcdbc48f; go-fuse v2.1.1-0.20210825171523-3ab5d95a30ae; 2021-09-14 go1.17.1 linux/amd64
-AES-GCM-256-OpenSSL 868.09 MB/s
-AES-GCM-256-Go 997.97 MB/s (selected in auto mode)
-AES-SIV-512-Go 160.72 MB/s
-XChaCha20-Poly1305-OpenSSL 722.14 MB/s
-XChaCha20-Poly1305-Go 841.89 MB/s (selected in auto mode)
+gocryptfs v2.2.0-beta1-5-g52b0444-dirty; go-fuse v2.1.1-0.20210825171523-3ab5d95a30ae; 2021-09-14 go1.17.1 linux/amd64
+cpu: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz; with AES acceleration
+AES-GCM-256-OpenSSL 862.79 MB/s
+AES-GCM-256-Go 997.71 MB/s (selected in auto mode)
+AES-SIV-512-Go 159.58 MB/s
+XChaCha20-Poly1305-OpenSSL 729.65 MB/s
+XChaCha20-Poly1305-Go 843.97 MB/s (selected in auto mode)
```
You can run `./benchmark.bash` to run gocryptfs' canonical set of
diff --git a/internal/speed/cpuinfo.go b/internal/speed/cpuinfo.go
new file mode 100644
index 0000000..09e7a89
--- /dev/null
+++ b/internal/speed/cpuinfo.go
@@ -0,0 +1,54 @@
+package speed
+
+import (
+ "io/ioutil"
+ "os"
+ "runtime"
+ "strings"
+)
+
+// cpuModelName returns the "model name" acc. to /proc/cpuinfo, or ""
+// on error.
+//
+// Examples: On my desktop PC:
+//
+// $ grep "model name" /proc/cpuinfo
+// model name : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
+//
+// --> Returns "Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz".
+//
+// On a Raspberry Pi 4:
+//
+// $ grep "model name" /proc/cpuinfo
+// (empty)
+// $ grep Hardware /proc/cpuinfo
+// Hardware : BCM2835
+//
+// --> Returns "BCM2835"
+func cpuModelName() string {
+ if runtime.GOOS != "linux" {
+ return ""
+ }
+ f, err := os.Open("/proc/cpuinfo")
+ if err != nil {
+ return ""
+ }
+ content, err := ioutil.ReadAll(f)
+ if err != nil {
+ return ""
+ }
+ lines := strings.Split(string(content), "\n")
+ // Look for "model name", then for "Hardware" (arm devices don't have "model name")
+ for _, want := range []string{"model name", "Hardware"} {
+ for _, line := range lines {
+ if strings.HasPrefix(line, want) {
+ parts := strings.SplitN(line, ":", 2)
+ if len(parts) != 2 {
+ continue
+ }
+ return strings.TrimSpace(parts[1])
+ }
+ }
+ }
+ return ""
+}
diff --git a/internal/speed/speed.go b/internal/speed/speed.go
index 231a982..0b1a51a 100644
--- a/internal/speed/speed.go
+++ b/internal/speed/speed.go
@@ -27,6 +27,16 @@ const blockSize = 4096
// Run - run the speed the test and print the results.
func Run() {
+ cpu := cpuModelName()
+ if cpu == "" {
+ cpu = "unknown"
+ }
+ aes := "; no AES acceleration"
+ if stupidgcm.CpuHasAES() {
+ aes = "; with AES acceleration"
+ }
+ fmt.Printf("cpu: %s%s\n", cpu, aes)
+
bTable := []struct {
name string
f func(*testing.B)