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β whenprint_detailsis used, print it as CSV instead. spreadsheet girlies rise π--extra_metrics=<string>β extra metrics to be computed. these ONLY show up with--print_detailsor--print_details_csv, so don't come crying if you forgot the flag π. it's a comma-separated list ofNAME:COMMANDpairs;COMMANDgets 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 (seeParseDescription; 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 to255for SDR images, and4000for 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 separatedkey=valuepairs. the keycolor_spaceindicatesColorEncoding(seeParseDescription; 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 to255π--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 (>1for more precise measurements). defaults to1π--decode_reps=<unsigned>β how many times to decode (>1for more precise measurements). defaults to1π--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
- ubuntu stonking: libjxl-devtools 0.11.2-5.1ubuntu1 Β· BSD-3-clause-Google
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms