BENCHMARK_XL(1)

✨ benchmark_xl β€” the manual, but make it make sense ✨

okay so bestie, you're in section 1 of the manual (User Commands, iykyk) and this is the whole entire page for benchmark_xl πŸ’– it's a benchmarking tool, it's giving main character energy for image codecs, and yes we are reading the WHOLE thing together, no skimming, periodt.


🌸 NAME 🌸

benchmark_xl - benchmark_xl

like. that's it. that's the name. iconic of it honestly πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

benchmark_xl [OPTIONS...]

that's the whole vibe check: you run it, you feed it [OPTIONS...], it does its thing ✨


πŸ’œ DESCRIPTION πŸ’œ

okay so here's the part where every single option lives. no cap, there are a LOT. grab a snack πŸ“

  • --input=<string> β€” the file, or the file pattern that matches your input files. that's your corpus, bestie 🫢
  • --codec=<string> β€” a comma separated list of image codec descriptions to benchmark. yes, plural, you can throw multiple codecs in there and let them fight πŸ”₯
  • --print_details, --noprint_details β€” prints size and distortion for each image. NOT safe for concurrent benchmark runs, so don't be out here running these side by side, it's giving chaos πŸ’€
  • --print_details_csv, --noprint_details_csv β€” when print_details is used, print it as CSV instead. spreadsheet girlies rise 🌈
  • --extra_metrics=<string> β€” extra metrics to be computed. these ONLY show up with --print_details or --print_details_csv, so don't come crying if you forgot the flag 😭. it's a comma-separated list of NAME:COMMAND pairs; COMMAND gets invoked with the original image as the first argument, the decompressed image as a second argument, and the name of the file where to write the metric value (as a single floating point number) as the third argument. three args, no more, no less πŸ’…
  • --print_more_stats, --noprint_more_stats β€” prints codec-specific stats. also NOT safe for concurrent benchmark runs πŸ™ˆ
  • --print_distance_percentiles, --noprint_distance_percentiles β€” prints distance percentiles for the corpus. you guessed it: NOT safe for concurrent benchmark runs πŸ’€
  • --silent_errors, --nosilent_errors β€” if true (that's the silent one), it doesn't print error messages on compression or decompression errors. the error counts are still visible in the 'Errors' column of the result table, so you're not flying blind πŸ‘€. ⚠️ heads up though: depending on the JXL build settings, error messages and asserts from within the codec may be printed irrespective of this flag anyway, so use a release build to ensure no messages. it's giving "I tried my best" 😭
  • --save_compressed, --nosave_compressed β€” saves the compressed files for each input image and each codec. so many little files. so cute πŸŽ€
  • --save_decompressed, --nosave_decompressed β€” saves the decompressed files as PNG for each input image and each codec πŸ–ΌοΈ
  • --output_extension=<string> β€” the extension (starting with a dot!) to use for saving output images. dot. don't forget the dot. 🫢
  • --output_description=<string> β€” color encoding (see ParseDescription; e.g. RGB_D65_SRG_Rel_709) for saving output images, and it defaults to sRGB ✨
  • --intensity_target=<scalar> β€” intended viewing intensity target in nits. defaults to 255 for SDR images, and 4000 for HDR images (that's when the input image uses PQ or HLG transfer function) ⭐
  • --dec-hints=<string> β€” color encoding hints for the input images to the encoder. comma separated key=value pairs. the key color_space indicates ColorEncoding (see ParseDescription; e.g. RGB_D65_SRG_Rel_709) for input images without color encoding (such as PNM) 🧚
  • --override_bitdepth=<unsigned> β€” if nonzero, store the given bit depth in the JPEG XL file metadata (1-32), instead of using the bit depth from the original input image. you get to be in charge, lowkey πŸ‘‘
  • --mul_output=<scalar> β€” if nonzero, multiplies linear sRGB by this and clamps to 255 🌈
  • --save_heatmap, --nosave_heatmap β€” saves the heatmap images πŸ”₯πŸ”₯πŸ”₯ (literally heatmap)
  • --heatmap_good=<scalar> β€” if greater than zero, use this as the good threshold for creating heatmap images πŸ’š
  • --heatmap_bad=<scalar> β€” if greater than zero, use this as the bad threshold for creating heatmap images ❀️
  • --write_html_report, --nowrite_html_report β€” creates an html report with original and compressed images. show and tell time πŸŽ€
  • --html_report_self_contained, --nohtml_report_self_contained β€” Base64-encode the images in the HTML report rather than use external file names. may cause very large HTML data size, so like, be aware πŸ’€
  • --html_report_use_decompressed, --nohtml_report_use_decompressed β€” show the compressed image as decompressed to --output_extension πŸ‘€
  • --html_report_add_heatmap, --nohtml_report_add_heatmap β€” add heatmaps to the image comparisons πŸ”₯
  • --markdown, --nomarkdown β€” adds formatting around the ASCII table so it renders correctly in Markdown based interfaces ✨ (yes bestie, your table can slay in Markdown too)
  • --more_columns, --nomore_columns β€” print extra columns in the table πŸ“Š
  • --originals_url=<string> β€” url prefix to serve original images from in the html report 🌐
  • --output_dir=<string> β€” if not empty, save compressed and decompressed images here πŸ“
  • --num_threads=<integer> β€” the number of threads for concurrent benchmarking. defaults to 1 thread per CPU core (that's when it's negative) 🧡
  • --inner_threads=<integer> β€” the number of extra threads per task. defaults to occupy cores (when negative) 🧡🧡
  • --encode_reps=<unsigned> β€” how many times to encode (>1 for more precise measurements). defaults to 1 πŸ”
  • --decode_reps=<unsigned> β€” how many times to decode (>1 for more precise measurements). defaults to 1 πŸ”
  • --sample_tmp_dir=<string> β€” directory to put samples from input images πŸ—‚οΈ
  • --num_samples=<integer> β€” how many sample areas to take πŸ”
  • --sample_dimensions=<integer> β€” how big the areas to sample from the input are πŸ“
  • --error_pnorm=<scalar> β€” smallest p norm for pooling butteraugli values 🧈
  • --show_progress, --noshow_progress β€” show activity dots per completed file during the benchmark. dots!! ✨✨✨
  • --skip_butteraugli, --noskip_butteraugli β€” if true, it doesn't compute distance metrics, only compression and decompression speed and size. the distance numbers shown in the table are invalid when you do that, so don't quote them πŸ’€
  • --decode_only, --nodecode_only β€” if true, it only decodes, and the input files must be compressed with a compatible format for the given codec(s). it only measures decompression speed and sizes, and it can only use a single set of compatible decoders. the distance numbers AND compression speeds shown in the table are invalid in this mode πŸ™ˆ
  • --generations=<unsigned> β€” if nonzero, enables generation loss testing with this number of intermediate generations. that is, the decoded image gets re-encoded, iteratively, N times. generational trauma but for pixels 😭 (it's for science, bestie)
  • --custom_codec_extension=<string> β€” converts input and output of the codec to this file type (default: png) πŸŽ€
  • --custom_codec_colorspace=<string> β€” if not empty, converts input and output of the codec to this colorspace 🌈
  • --custom_codec_quiet, --nocustom_codec_quiet β€” whether stdin and stdout of the custom codec should be shown. shy codec or loud codec, your call 🀫
  • --qprogressive, --noqprogressive β€” enable quantized progressive mode for AC ✨
  • --progressive, --noprogressive β€” enable progressive mode for AC ✨
  • --progressive_dc=<integer> β€” enable progressive mode for DC ✨
  • --noise=0|1 β€” enable(1)/disable(0) noise generation 🌫️
  • --dots=0|1 β€” enable(1)/disable(0) dots generation ⚫
  • --patches=0|1 β€” enable(1)/disable(0) patch dictionary 🩹
  • --debug_image_dir=<string> β€” if not empty, saves debug images for each input image and each codec that provides it to this directory πŸ›πŸ”
  • --qtables=<string> β€” custom base quantization tables πŸ“‹
  • --search_q_start=<scalar> β€” starting quality for quality-to-target search 🎯
  • --search_q_min=<scalar> β€” minimum quality for quality-to-target search ⬇️
  • --search_q_max=<scalar> β€” maximum quality for quality-to-target search ⬆️
  • --search_d_min=<scalar> β€” minimum distance for quality-to-target search πŸ“‰
  • --search_d_max=<scalar> β€” maximum distance for quality-to-target search πŸ“ˆ
  • --search_tolerance=<scalar> β€” percentage value; if the quality-to-target search result relative error is within this, the search stops πŸ›‘
  • --search_q_precision=<scalar> β€” if the last quality change in quality-to-target search is within this value, the search stops πŸ›‘
  • --search_first_iter_slope=<scalar> β€” slope of the first extrapolation step in quality-to-target search πŸ“
  • --search_max_iters=<integer> β€” maximum search steps in quality-to-target search 🏁
  • --avif_chroma_subsampling=444/422/420/400 β€” default AVIF chroma subsampling (default: 444) 🎨
  • -h, --help β€” prints this help message. all options are shown above 🫢 (yes, the whole list. we told you it was a lot)

πŸ‘‘ AUTHOR πŸ‘‘

this manual page was written by Mathieu Malaterre <malat@debian.org> for the Debian GNU/Linux system (but may be used by others) πŸ’– thank you for your service, legend 🫑


okay bestie that's the whole page, we made it, we survived, we're stronger πŸ¦‹

sign-off time ✨ this was benchmark_xl version 0.11.2, dated August 2026 β€” and that's the BENCHMARK_XL(1) page, done and dusted πŸ’…πŸ’– no cap.

πŸ“¦ where this page comes from