BCJ (algorithm)

{{short description|Data compression technique}}

In data compression, BCJ, short for branch/call/jump, refers to a technique that improves the compression of machine code by replacing relative branch addresses with absolute ones. This allows a Lempel–Ziv compressor to identify duplicate targets and more efficiently encode them. On decompression, the inverse filter restores the original encoding. Different BCJ filters are used for different instruction sets, as each use different opcodes for branching.

A form of BCJ is seen in Microsoft's cabinet file format from 1996, which filters x86 CALL instructions for the LZX compressor.{{cite web |title=cabextract: Free Software for extracting Microsoft cabinet files |url=https://www.cabextract.org.uk/ |accessdate=17 March 2020}} The 7z and xz file formats implement BCJ for multiple architectures.{{cite web |title=The .xz File Format |url=https://tukaani.org/xz/xz-file-format.txt}} ZPAQ calls its x86 BCJ as "E8E9", after the opcode values.{{cite web |title=ZPAQ |url=http://mattmahoney.net/dc/zpaq.html |website=mattmahoney.net}}

bsdiff, a tool for delta updates, circumvents the need of writing architecture-specific BCJ tools by encoding bytewise differences. This allows it to be much better than the "match and copy" type tools such as VCDIFF,Colin Percival, Naive differences of executable code, http://www.daemonology.net/bsdiff/, 2003. giving an output size of only 6% for Google Chrome. However, Google's courgette, which adds a layer of explicit disassembly, is able to produce 9× smaller diffs.{{cite web |title=Software Updates: Courgette |url=https://www.chromium.org/developers/design-documents/software-updates-courgette/ |website=www.chromium.org}}

Effect

For a squashfs image of a Fedora Linux 31 live image, using x86 BCJ saves an extra 30 MB out of the ~1.7 GB compressed size, but doubles the installation time.{{cite web |title=Changes/OptimizeSquashFS - Fedora Project Wiki |url=https://fedoraproject.org/wiki/Changes/OptimizeSquashFS |website=fedoraproject.org}}

References