Skip to content

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