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)