Optimizing MAKEOPTS in Gentoo Linux
ethod for benchmarking parallel make job counts to determine the most efficient MAKEOPTS setting on Gentoo Linux
Generate Minimal GCC Benchmark Makefile
cat > gen_bench.sh <<'EOF'
#!/bin/sh
set -eu
FILES=${FILES:-64}
FUNCS=${FUNCS:-200}
STEPS=${STEPS:-2000}
rm -f file*.c main.c
f=0
while [ "$f" -lt "$FILES" ]; do
out="file${f}.c"
: > "$out"
printf '%s\n' '#include <stdint.h>' >> "$out"
i=0
while [ "$i" -lt "$FUNCS" ]; do
printf 'uint64_t func_%d_%d(uint64_t x){\n' "$f" "$i" >> "$out"
printf '%s\n' ' uint64_t a=x^0x9e3779b97f4a7c15ULL;' >> "$out"
printf '%s\n' ' uint64_t b=(x<<1)|1;' >> "$out"
printf '%s\n' ' uint64_t c=0xBF58476D1CE4E5B9ULL;' >> "$out"
s=0
while [ "$s" -lt "$STEPS" ]; do
k=$((s & 7))
printf ' if ((a&7)==%d) { a = (a + b) ^ (a >> 3); }\n' "$k" >> "$out"
printf ' else { a = (a * c + %dULL) ^ (a << 5); }\n' "$s" >> "$out"
printf ' b ^= (a + %dULL) * 0x94D049BB133111EBULL;\n' "$s" >> "$out"
s=$((s+1))
done
printf '%s\n' ' return a ^ b;' >> "$out"
printf '%s\n' '}' >> "$out"
i=$((i+1))
done
f=$((f+1))
done
printf '%s\n' 'int main(void){return 0;}' > main.c
EOF
Benchmark Parallel Make Job Counts (-j) Performance
n=$(nproc)
for j in 1 "$((n/2))" "$n" "$((n+1))" "$((n*2))"; do
[ "$j" -lt 1 ] && continue
make clean >/dev/null 2>&1
printf "jobs=%-3s " "$j"
t=$( { TIMEFORMAT=$'real=%3R user=%3U sys=%3S'
time make -j"$j" >/dev/null 2>build.log
} 2>&1 )
echo "$t"
done