Go isn’t my favourit language, but I find it is interesting for some things. It comes with a tool for benchmarking. By default tool runs benchmarks in multiple threads, depending on number of available CPU cores (see here). This produces unpredictable results when testing small functions. There are few ways to control this behaviour and one of them is to set
GOMAXPROCS environment variable to
1. It seems that also
-test.cpu 1 option needs to be added to the command line.
Nevertheless, results that I’ve got by using
GOMAXPROCS where fluctuating from run to run. Most stable results were produced when process has been bound to CPU. This can be done with
sudo taskset 2 ./sidh.test -test.v -test.bench="BenchmarkBobKeyGenPub" -test.run="^A" -test.cpu 1
In this case I’ve found out that CPU 1 was getting low number of IRQ’s on my system (is there a way to configure IRQ’s so that they are delivered to CPU 0?).
Before testing I’m changing the CPUs scaling governor to
echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo 0 > /sys/devices/system/cpu/cpu2/online echo 0 > /sys/devices/system/cpu/cpu3/online
TODO: * GODEBUGCPU (https://go-review.googlesource.com/c/go/+/91737) * benchmem * benchcmp