xzbench:start
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| xzbench:start [2026/10/09 13:07] – removed - external edit (Unknown date) 127.0.0.1 | xzbench:start [2026/10/09 13:12] (current) – [How to run it] millerjs | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Benchmarking CPUs with xz ====== | ||
| + | {{xzbenchmarks}} | ||
| + | |||
| + | ===== How to run it ===== | ||
| + | |||
| + | On linux or unix, from bash: | ||
| + | '' | ||
| + | |||
| + | On windows in powershell: | ||
| + | |||
| + | |||
| + | ++++ Here's an overly complicated script| | ||
| + | |||
| + | <file bash xz-benchmark.sh> | ||
| + | # | ||
| + | # | ||
| + | # xz-benchmark.sh — Run the xz single-thread and multi-thread benchmarks | ||
| + | # on a ~1GB text file, collect CPU info, and output a pasteable block. | ||
| + | # | ||
| + | # Usage: | ||
| + | # | ||
| + | # | ||
| + | # If enwik9 is not present, it will be downloaded automatically. | ||
| + | # The submitter name defaults to $USER. | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | # ── Configuration ───────────────────────────────────────────────────────── | ||
| + | |||
| + | INPUT_FILE=" | ||
| + | SUBMITTER=" | ||
| + | BENCH_DIR=" | ||
| + | OUTPUT_FILE=" | ||
| + | |||
| + | # ── Helpers ─────────────────────────────────────────────────────────────── | ||
| + | |||
| + | err() { echo " | ||
| + | info() { echo ">>> | ||
| + | |||
| + | # Parse "real Xm Y.YYYs" | ||
| + | parse_real() { | ||
| + | local line=" | ||
| + | # Accept formats like " | ||
| + | if [[ " | ||
| + | local min=" | ||
| + | local sec=" | ||
| + | printf " | ||
| + | elif [[ " | ||
| + | printf " | ||
| + | else | ||
| + | printf " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # ── Prerequisites ───────────────────────────────────────────────────────── | ||
| + | |||
| + | command -v xz >/ | ||
| + | command -v lscpu >/ | ||
| + | |||
| + | # ── Download input file if needed ───────────────────────────────────────── | ||
| + | |||
| + | if [[ ! -f " | ||
| + | info " | ||
| + | if command -v wget >/ | ||
| + | wget -q -O " | ||
| + | elif command -v curl >/ | ||
| + | curl -sL -o " | ||
| + | else | ||
| + | err "Need wget or curl to download enwik9" | ||
| + | fi | ||
| + | |||
| + | # enwik9.zip contains enwik9 | ||
| + | if file " | ||
| + | info " | ||
| + | unzip -o " | ||
| + | fi | ||
| + | |||
| + | [[ -f " | ||
| + | fi | ||
| + | |||
| + | info "Input file: $INPUT_FILE ($(du -h " | ||
| + | |||
| + | # ── Collect system info ─────────────────────────────────────────────────── | ||
| + | |||
| + | info " | ||
| + | |||
| + | # CPU model name | ||
| + | CPU_MODEL=" | ||
| + | |||
| + | # CPU count info | ||
| + | CPU_SOCKETS=" | ||
| + | CORES_PER_SOCKET=" | ||
| + | THREADS_PER_CORE=" | ||
| + | |||
| + | TOTAL_CORES=$(( CPU_SOCKETS * CORES_PER_SOCKET )) | ||
| + | TOTAL_THREADS=$(( TOTAL_CORES * THREADS_PER_CORE )) | ||
| + | |||
| + | # Clock speeds | ||
| + | CPU_MHZ=" | ||
| + | if [[ -z " | ||
| + | CPU_MHZ=" | ||
| + | fi | ||
| + | |||
| + | # Base and boost clocks (best effort) | ||
| + | BASE_CLOCK=" | ||
| + | BOOST_CLOCK=" | ||
| + | |||
| + | if [[ -n " | ||
| + | BASE_CLOCK=" | ||
| + | else | ||
| + | BASE_CLOCK=" | ||
| + | fi | ||
| + | |||
| + | if [[ -n " | ||
| + | BOOST_CLOCK=" | ||
| + | else | ||
| + | BOOST_CLOCK=" | ||
| + | fi | ||
| + | |||
| + | # Architecture | ||
| + | ARCH=" | ||
| + | |||
| + | # RAM | ||
| + | RAM_KB=" | ||
| + | RAM_GB=" | ||
| + | RAM=" | ||
| + | |||
| + | # OS | ||
| + | if [[ -f / | ||
| + | . / | ||
| + | OS=" | ||
| + | else | ||
| + | OS=" | ||
| + | fi | ||
| + | |||
| + | # Hostname | ||
| + | HOST=" | ||
| + | |||
| + | # xz version | ||
| + | XZ_VERSION=" | ||
| + | |||
| + | info "Host: $HOST | CPU: $CPU_MODEL | Cores: $TOTAL_CORES | Arch: $ARCH" | ||
| + | |||
| + | # ── Run benchmarks ──────────────────────────────────────────────────────── | ||
| + | |||
| + | # We use bash's TIMEFORMAT to capture times in a parseable format | ||
| + | # TIMEFORMAT=' | ||
| + | # But we want the "Xm Y.YYYs" | ||
| + | # We'll use the `time` builtin with a custom format, then convert. | ||
| + | |||
| + | run_bench() { | ||
| + | local threads=" | ||
| + | local label=" | ||
| + | local time_real time_user time_sys | ||
| + | local output | ||
| + | |||
| + | info " | ||
| + | |||
| + | # Use TIMEFORMAT to get seconds, then convert to m/s format | ||
| + | # Capturing time output requires a subshell trick | ||
| + | { | ||
| + | TIMEFORMAT=$' | ||
| + | time xz -k -T" | ||
| + | } 2> " | ||
| + | |||
| + | read -r time_real time_user time_sys < " | ||
| + | rm -f " | ||
| + | |||
| + | # Convert seconds → "Xm Y.YYYs" | ||
| + | local real_fmt user_fmt sys_fmt | ||
| + | real_fmt=$(sec_to_fmt " | ||
| + | user_fmt=$(sec_to_fmt " | ||
| + | sys_fmt=$(sec_to_fmt " | ||
| + | |||
| + | echo " | ||
| + | } | ||
| + | |||
| + | sec_to_fmt() { | ||
| + | local sec=" | ||
| + | local int_part=" | ||
| + | [[ " | ||
| + | local min=$(( int_part / 60 )) | ||
| + | local rem | ||
| + | rem=$(awk " | ||
| + | printf " | ||
| + | } | ||
| + | |||
| + | # Convert "Xm Y.YYYs" | ||
| + | sec_to_num() { | ||
| + | local val=" | ||
| + | if [[ " | ||
| + | awk " | ||
| + | elif [[ " | ||
| + | awk " | ||
| + | else | ||
| + | printf " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Run single-threaded benchmark | ||
| + | SYNC_RESULT=$(run_bench 1 " | ||
| + | sleep 2 | ||
| + | sync | ||
| + | |||
| + | ST_REAL=" | ||
| + | ST_USER=" | ||
| + | ST_SYS=" | ||
| + | |||
| + | # Run multi-threaded benchmark | ||
| + | MT_RESULT=$(run_bench 0 " | ||
| + | sync | ||
| + | |||
| + | MT_REAL=" | ||
| + | MT_USER=" | ||
| + | MT_SYS=" | ||
| + | |||
| + | # ── Output pasteable block ──────────────────────────────────────────────── | ||
| + | |||
| + | info " | ||
| + | |||
| + | # Cores string for multithread | ||
| + | if [[ " | ||
| + | MT_CORES=" | ||
| + | SMT_CORES=" | ||
| + | else | ||
| + | MT_CORES=" | ||
| + | SMT_CORES=" | ||
| + | fi | ||
| + | |||
| + | # Pre-compute numeric seconds for SQL | ||
| + | ST_REAL_NUM=$(sec_to_num " | ||
| + | ST_USER_NUM=$(sec_to_num " | ||
| + | ST_SYS_NUM=$(sec_to_num " | ||
| + | MT_REAL_NUM=$(sec_to_num " | ||
| + | MT_USER_NUM=$(sec_to_num " | ||
| + | MT_SYS_NUM=$(sec_to_num " | ||
| + | |||
| + | cat <<EOF | ||
| + | |||
| + | ╔══════════════════════════════════════════════════════════════════════════╗ | ||
| + | ║ XZ BENCHMARK RESULTS | ||
| + | ╠══════════════════════════════════════════════════════════════════════════╣ | ||
| + | |||
| + | ── System Information ── | ||
| + | Host: $HOST | ||
| + | Model: | ||
| + | Submitter: | ||
| + | CPU: $CPU_MODEL | ||
| + | Base Clock: | ||
| + | Boost Clock: | ||
| + | Sockets: | ||
| + | Cores/ | ||
| + | Threads/ | ||
| + | Total Cores: | ||
| + | Total Threads: | ||
| + | Arch: $ARCH | ||
| + | RAM: $RAM | ||
| + | OS: $OS | ||
| + | xz Version: | ||
| + | Input File: | ||
| + | |||
| + | ── Results ── | ||
| + | |||
| + | Single Thread (-T1): | ||
| + | real: $ST_REAL | ||
| + | user: $ST_USER | ||
| + | sys: | ||
| + | |||
| + | Multi Thread (-T0): | ||
| + | real: $MT_REAL | ||
| + | user: $MT_USER | ||
| + | sys: | ||
| + | |||
| + | ── Pasteable Wiki Table Row (MediaWiki) ── | ||
| + | |||
| + | === Single Thread === | ||
| + | |- | ||
| + | ! $HOST | ||
| + | | [enter model] | ||
| + | | $SUBMITTER | ||
| + | | $CPU_MODEL | ||
| + | | $BASE_CLOCK | ||
| + | | $BOOST_CLOCK | ||
| + | | $ARCH | ||
| + | | $RAM | ||
| + | | $OS | ||
| + | | $ST_REAL | ||
| + | | $ST_USER | ||
| + | | $ST_SYS | ||
| + | |||
| + | === Multithread (Real Cores) === | ||
| + | |- | ||
| + | ! $HOST | ||
| + | | [enter model] | ||
| + | | $SUBMITTER | ||
| + | | $CPU_MODEL | ||
| + | | $BASE_CLOCK | ||
| + | | $BOOST_CLOCK | ||
| + | | $MT_CORES | ||
| + | | $ARCH | ||
| + | | $RAM | ||
| + | | $OS | ||
| + | | $MT_REAL | ||
| + | | $MT_USER | ||
| + | | $MT_SYS | ||
| + | |||
| + | ── Pasteable Wiki Table Row (DokuWiki) ── | ||
| + | |||
| + | ^ Host ^ Model ^ Submitter ^ CPU ^ Base Clock ^ Boost Clock ^ Cores ^ Arch ^ RAM ^ OS ^ real ^ user ^ sys ^ | ||
| + | | $HOST | [enter model] | $SUBMITTER | $CPU_MODEL | $BASE_CLOCK | $BOOST_CLOCK | $MT_CORES | $ARCH | $RAM | $OS | $ST_REAL | $ST_USER | $ST_SYS | | ||
| + | |||
| + | ── SQL INSERT (for direct database submission) ── | ||
| + | |||
| + | INSERT INTO results (test_type, host, model, submitter, cpu, base_clock, boost_clock, | ||
| + | VALUES | ||
| + | (' | ||
| + | (' | ||
| + | |||
| + | ── JSON (for DokuWiki plugin / API submission) ── | ||
| + | |||
| + | [ | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | |||
| + | ╚══════════════════════════════════════════════════════════════════════════╝ | ||
| + | EOF | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
