Table of Contents
Mid late July work on compression, Exomizer depackers benchmark
2026-07-26
testrand
- Add the defines REPEAT, REPEATAMOUNT, REPEATSIZE. These were used to test match lengths and match offsets of nearly 64 KiB in Exomizer 3 compressed files.
lDebug
All changes concern the mak.sh build script.
- Ignore Scan: and Time: lines from decompression test program.
- Use a bash array variable to transfer the
$@options list to the bash running for makefile recipes, in a new option file calledoptionar.dat. This file contains thedeclare -poutput, which the inner bash can read to obtain the array variable. - Add -ef8 and -n parameters to the bzpack program. Testing this proved difficult because bzpack would run out of memory on all builds, including just
maker(createldebug.comwithout DPMI, debuggable mode, or conditionally debuggable mode).
I eventually managed to create a build that compressed successfully with bzpack, with this command: INICOMP_METHOD=bzp build_name=sma build_options="$(printf ' %q' -D_EXTENSIONS=0 -D_IMMASM=0 -D_RM=0 -D_RN=0)" build_inicomp_options=-D_TIME_FORCE INICOMP_BZPACK=~/proj/bzpack/src/bzpack.clang ./mak.sh
Oddly enough, during testing a while ago the bzpack command did succeed for a build without these specific defines. This week, it would reserve several GiB of RAM before being killed.
The patch being referenced in the changeset message is given in the https://pushbx.org/ecm/test/20260713/20260713-bzpack-switches.diff file, as presented in a bzpack ticket on github. Prior to an inicomp change, another patch at https://pushbx.org/ecm/test/20260713/20260713-bzpack-eod.diff was also needed to restore the expected End Of Data marker (change 256 to 511).
- Add the variable build_checkpl_options to variable setup.
- Expand the build_*_options variables into bash array variables using
typeset -a(as suggested by a comment on unix stackexchange). This doesn't change anything for insufficiently escaped variable contents. However, if the variable is filled like the following, it allows passing blanks in parameters to the assembler:build_inicomp_options="$(printf ' %q' -D_TIME_FORCE "-D_APPEND_NAME=' foo bar baz'")" - Add the INICOMP_PREFER_INCLUDE_DIR variable, to allow including older revisions of inicomp packer source text files from a repo other than the one used for inicomp.asm
This should provide everything needed for creating test files to run on other machines in order to benchmark depacker performance.
kernwrap
Mostly changes picked from lDebug.
- Add -ef8 and -n parameters to bzpack command.
- Expand build_*_options variables using
typeset -a. - Add the INICOMP_PREFER_INCLUDE_DIR variable and a default for it.
inicomp
Exomizer 3 depacker optimisations and changes:
- 733 Jump to depack.error on buffer overflow instead of returning an error status.
- 734 Optimise the .end_check code, check the high word last.
- 735 Initialise the full dx to
?offsets1early, saving an instruction. - 738 Get rid of a cmc to check error status. Can use
jncto jump to error code. - 739 Get rid of another cmc. Again, use
jncto jump to error code. - 741 Optimise setting ax = 1 in
generate_table - 742 Optimise the add di, 3 in
generate_table - 746 Insert some NOPs for speed(?).
- 747 Optimise the chunk length check in copy_data, load length into ax first and check that rather than cx.
Time display related changes:
- Add first _TIME display, only ticks elapsed yet.
- Display the time in ms with two decimal places (calculated as centi milli seconds).
- Move .quit_with_time to end of init2 core code, allowing to use anonymous local labels.
- Make quit_with_time a nonlocal label, allowing to use local labels.
- Display the ms time in readable way (not at all <2.0s, or as seconds with one decimal place <1.0min, minutes with one decimal place <60.0min, or minutes without decimal places).
- Display the ms per run, not for entire loop.
- Implement displaying at least a certain amount of text for
store_dec_dword_* - Display total loop duration (as seconds with two decimal places <10.0s, seconds with one decimal place <1.0min, minutes with one decimal place <60.0min, or minutes without decimal places).
- Fix time overflow handling. The total time in ticks times 10000 times 100 can overflow 48 bits, and both the time in centi milli seconds total and per run can overflow 32 bits (about 11.9h).
- Avoid possible 48 bits overflow of tick times 10000 times 100, by calculating using 64 bits the product and then dividing by 182 (from 182 ticks/10 seconds).
- Allow appending a define or incbin from a define to the Time: line's identifier trail.
- For init2_error_dec_dword_* call init2_error_disp_counted so all the time related writes go through that function.
- Implement the L= parameter to specify a time log file. SFNs only as yet. The Time: line is written both to stderr and this file, except for the "Time: " prefix itself which only goes to stderr.
Other:
- Allow bzpack format End Of Data marker as 256 in addition to traditional (511). As discussed on github.
Test results
The following tests were run to test the most recent exodecr.asm (Exomizer 3) depacker changes. Generally the expected speedups are reached.
The times for the AMD A10-7870K with KVM, the 686 machine with MSW 98SE running a V86M DOS box, and the 686 machine running in R86M were similar, all about 30ms. (Note that the R86M test shown here ran with fdapm apmdos, idledpms /s-, and lbacache 32000. Especially the last one equalises the times a lot, without it times up to 100.50ms were observed.)
The server time shows up as more than double the others, with 62ms and more.
AMD A10-7870K with KVM dosemu2
Using dosemu2-2.0pre9-dev-20230913-1520-g10e84a9e1, in order of depacker revision:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' a10kvme2.log
35.95ms/run, 1024 runs, sum 36.8s=670t exodecr hg 732:2789b7b231f5 a10kvme2.log
35.03ms/run, 1024 runs, sum 35.8s=653t exodecr hg 733:ab62390369ad a10kvme2.log
34.76ms/run, 1024 runs, sum 35.6s=648t exodecr hg 734:06e77fbda68e a10kvme2.log
35.19ms/run, 1024 runs, sum 36.0s=656t exodecr hg 735:dcd50f6e0f70 a10kvme2.log
34.82ms/run, 1024 runs, sum 35.6s=649t exodecr hg 736:dc7c7640560a a10kvme2.log
35.25ms/run, 1024 runs, sum 36.0s=657t exodecr hg 737:0e19481bfe4c a10kvme2.log
35.09ms/run, 1024 runs, sum 35.9s=654t exodecr hg 738:52b7cc7558ca a10kvme2.log
35.25ms/run, 1024 runs, sum 36.0s=657t exodecr hg 739:f226d78afe82 a10kvme2.log
35.09ms/run, 1024 runs, sum 35.9s=654t exodecr hg 740:7bb770fe7f0b a10kvme2.log
35.03ms/run, 1024 runs, sum 35.8s=653t exodecr hg 741:34ca1ac53dcc a10kvme2.log
34.98ms/run, 1024 runs, sum 35.8s=652t exodecr hg 742:6e4cc88b66c3 a10kvme2.log
36.75ms/run, 1024 runs, sum 37.6s=685t exodecr hg 743:f9bef4cef3da a10kvme2.log
37.23ms/run, 1024 runs, sum 38.1s=694t exodecr hg 744:e35724a69a10 a10kvme2.log
36.21ms/run, 1024 runs, sum 37.0s=675t exodecr hg 745:7ed4ac91ecb9 a10kvme2.log
34.93ms/run, 1024 runs, sum 35.7s=651t exodecr hg 746:3bd8b9361b1c a10kvme2.log
35.14ms/run, 1024 runs, sum 35.9s=655t exodecr hg 747:d22684dc82b9 a10kvme2.log
And in order of performance:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' a10kvme2.log | LC_ALL=C sort
34.76ms/run, 1024 runs, sum 35.6s=648t exodecr hg 734:06e77fbda68e a10kvme2.log
34.82ms/run, 1024 runs, sum 35.6s=649t exodecr hg 736:dc7c7640560a a10kvme2.log
34.93ms/run, 1024 runs, sum 35.7s=651t exodecr hg 746:3bd8b9361b1c a10kvme2.log
34.98ms/run, 1024 runs, sum 35.8s=652t exodecr hg 742:6e4cc88b66c3 a10kvme2.log
35.03ms/run, 1024 runs, sum 35.8s=653t exodecr hg 733:ab62390369ad a10kvme2.log
35.03ms/run, 1024 runs, sum 35.8s=653t exodecr hg 741:34ca1ac53dcc a10kvme2.log
35.09ms/run, 1024 runs, sum 35.9s=654t exodecr hg 738:52b7cc7558ca a10kvme2.log
35.09ms/run, 1024 runs, sum 35.9s=654t exodecr hg 740:7bb770fe7f0b a10kvme2.log
35.14ms/run, 1024 runs, sum 35.9s=655t exodecr hg 747:d22684dc82b9 a10kvme2.log
35.19ms/run, 1024 runs, sum 36.0s=656t exodecr hg 735:dcd50f6e0f70 a10kvme2.log
35.25ms/run, 1024 runs, sum 36.0s=657t exodecr hg 737:0e19481bfe4c a10kvme2.log
35.25ms/run, 1024 runs, sum 36.0s=657t exodecr hg 739:f226d78afe82 a10kvme2.log
35.95ms/run, 1024 runs, sum 36.8s=670t exodecr hg 732:2789b7b231f5 a10kvme2.log
36.21ms/run, 1024 runs, sum 37.0s=675t exodecr hg 745:7ed4ac91ecb9 a10kvme2.log
36.75ms/run, 1024 runs, sum 37.6s=685t exodecr hg 743:f9bef4cef3da a10kvme2.log
37.23ms/run, 1024 runs, sum 38.1s=694t exodecr hg 744:e35724a69a10 a10kvme2.log
686 with Virtual 86 Mode DOS window on MSWindows 98SE
In order of depacker revision:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' 686msw98.log
33.10ms/run, 1024 runs, sum 33.9s=617t exodecr hg 732:2789b7b231f5 686msw98.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 733:ab62390369ad 686msw98.log
31.60ms/run, 1024 runs, sum 32.3s=589t exodecr hg 734:06e77fbda68e 686msw98.log
32.08ms/run, 1024 runs, sum 32.8s=598t exodecr hg 735:dcd50f6e0f70 686msw98.log
30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 736:dc7c7640560a 686msw98.log
30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 737:0e19481bfe4c 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 738:52b7cc7558ca 686msw98.log
30.42ms/run, 1024 runs, sum 31.1s=567t exodecr hg 739:f226d78afe82 686msw98.log
30.37ms/run, 1024 runs, sum 31.0s=566t exodecr hg 740:7bb770fe7f0b 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 741:34ca1ac53dcc 686msw98.log
30.58ms/run, 1024 runs, sum 31.3s=570t exodecr hg 742:6e4cc88b66c3 686msw98.log
30.42ms/run, 1024 runs, sum 31.1s=567t exodecr hg 743:f9bef4cef3da 686msw98.log
30.31ms/run, 1024 runs, sum 31.0s=565t exodecr hg 744:e35724a69a10 686msw98.log
30.20ms/run, 1024 runs, sum 30.9s=563t exodecr hg 745:7ed4ac91ecb9 686msw98.log
30.37ms/run, 1024 runs, sum 31.0s=566t exodecr hg 746:3bd8b9361b1c 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 747:d22684dc82b9 686msw98.log
And in order of performance:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' 686msw98.log | LC_ALL=C sort
30.20ms/run, 1024 runs, sum 30.9s=563t exodecr hg 745:7ed4ac91ecb9 686msw98.log
30.31ms/run, 1024 runs, sum 31.0s=565t exodecr hg 744:e35724a69a10 686msw98.log
30.37ms/run, 1024 runs, sum 31.0s=566t exodecr hg 740:7bb770fe7f0b 686msw98.log
30.37ms/run, 1024 runs, sum 31.0s=566t exodecr hg 746:3bd8b9361b1c 686msw98.log
30.42ms/run, 1024 runs, sum 31.1s=567t exodecr hg 739:f226d78afe82 686msw98.log
30.42ms/run, 1024 runs, sum 31.1s=567t exodecr hg 743:f9bef4cef3da 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 738:52b7cc7558ca 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 741:34ca1ac53dcc 686msw98.log
30.47ms/run, 1024 runs, sum 31.2s=568t exodecr hg 747:d22684dc82b9 686msw98.log
30.58ms/run, 1024 runs, sum 31.3s=570t exodecr hg 742:6e4cc88b66c3 686msw98.log
30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 736:dc7c7640560a 686msw98.log
30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 737:0e19481bfe4c 686msw98.log
31.60ms/run, 1024 runs, sum 32.3s=589t exodecr hg 734:06e77fbda68e 686msw98.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 733:ab62390369ad 686msw98.log
32.08ms/run, 1024 runs, sum 32.8s=598t exodecr hg 735:dcd50f6e0f70 686msw98.log
33.10ms/run, 1024 runs, sum 33.9s=617t exodecr hg 732:2789b7b231f5 686msw98.log
686 in Real 86 Mode MS-DOS v7.10, with LBACACHE
Using fdapm apmdos, identifying itself as "Written and conceived by Eric Auer. Version: 11 Sep 2009. Extensions by C. Masloch, 2021. Assembled on 2022-05-06." and idledpms 2 /s- identifying itself as Written and conceived by Eric Auer 2007. Extended by C. Masloch, 2021., both from the revision hg 62a7d769a9f6 of 2021-11-09. Also using lbacache 32000 identified as "LBAcache disk read cache for XMS + 386, E. Auer eric@coli.uni-sb.de 2001-2006 \ License: GPL 2. Up to 8 harddisks, 2 floppy, LBA / CHS. Version: 31aug2006."
In order of depacker revision:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' 686rmch2.log
34.07ms/run, 1024 runs, sum 34.8s=635t exodecr hg 732:2789b7b231f5 686rmch2.log
32.73ms/run, 1024 runs, sum 33.5s=610t exodecr hg 733:ab62390369ad 686rmch2.log
32.62ms/run, 1024 runs, sum 33.4s=608t exodecr hg 734:06e77fbda68e 686rmch2.log
32.78ms/run, 1024 runs, sum 33.5s=611t exodecr hg 735:dcd50f6e0f70 686rmch2.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 736:dc7c7640560a 686rmch2.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 737:0e19481bfe4c 686rmch2.log
31.65ms/run, 1024 runs, sum 32.4s=590t exodecr hg 738:52b7cc7558ca 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 739:f226d78afe82 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 740:7bb770fe7f0b 686rmch2.log
31.49ms/run, 1024 runs, sum 32.2s=587t exodecr hg 741:34ca1ac53dcc 686rmch2.log
31.65ms/run, 1024 runs, sum 32.4s=590t exodecr hg 742:6e4cc88b66c3 686rmch2.log
31.55ms/run, 1024 runs, sum 32.3s=588t exodecr hg 743:f9bef4cef3da 686rmch2.log
31.33ms/run, 1024 runs, sum 32.0s=584t exodecr hg 744:e35724a69a10 686rmch2.log
31.22ms/run, 1024 runs, sum 31.9s=582t exodecr hg 745:7ed4ac91ecb9 686rmch2.log
31.28ms/run, 1024 runs, sum 32.0s=583t exodecr hg 746:3bd8b9361b1c 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 747:d22684dc82b9 686rmch2.log
And in order of performance:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' 686rmch2.log | LC_ALL=C sort
31.22ms/run, 1024 runs, sum 31.9s=582t exodecr hg 745:7ed4ac91ecb9 686rmch2.log
31.28ms/run, 1024 runs, sum 32.0s=583t exodecr hg 746:3bd8b9361b1c 686rmch2.log
31.33ms/run, 1024 runs, sum 32.0s=584t exodecr hg 744:e35724a69a10 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 739:f226d78afe82 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 740:7bb770fe7f0b 686rmch2.log
31.44ms/run, 1024 runs, sum 32.1s=586t exodecr hg 747:d22684dc82b9 686rmch2.log
31.49ms/run, 1024 runs, sum 32.2s=587t exodecr hg 741:34ca1ac53dcc 686rmch2.log
31.55ms/run, 1024 runs, sum 32.3s=588t exodecr hg 743:f9bef4cef3da 686rmch2.log
31.65ms/run, 1024 runs, sum 32.4s=590t exodecr hg 738:52b7cc7558ca 686rmch2.log
31.65ms/run, 1024 runs, sum 32.4s=590t exodecr hg 742:6e4cc88b66c3 686rmch2.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 736:dc7c7640560a 686rmch2.log
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 737:0e19481bfe4c 686rmch2.log
32.62ms/run, 1024 runs, sum 33.4s=608t exodecr hg 734:06e77fbda68e 686rmch2.log
32.73ms/run, 1024 runs, sum 33.5s=610t exodecr hg 733:ab62390369ad 686rmch2.log
32.78ms/run, 1024 runs, sum 33.5s=611t exodecr hg 735:dcd50f6e0f70 686rmch2.log
34.07ms/run, 1024 runs, sum 34.8s=635t exodecr hg 732:2789b7b231f5 686rmch2.log
ulukai.org server with non-KVM dosemu2
Using dosemu2-2.0pre9-dev-20260713-4821-gd87206262, in order of depacker revision:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' ulukaie2.log
65.56ms/run, 1024 runs, sum 1.1min=1222t exodecr hg 732:2789b7b231f5 ulukaie2.log
65.30ms/run, 1024 runs, sum 1.1min=1217t exodecr hg 733:ab62390369ad ulukaie2.log
65.03ms/run, 1024 runs, sum 1.1min=1212t exodecr hg 734:06e77fbda68e ulukaie2.log
64.38ms/run, 1024 runs, sum 1.0min=1200t exodecr hg 735:dcd50f6e0f70 ulukaie2.log
65.19ms/run, 1024 runs, sum 1.1min=1215t exodecr hg 736:dc7c7640560a ulukaie2.log
66.74ms/run, 1024 runs, sum 1.1min=1244t exodecr hg 737:0e19481bfe4c ulukaie2.log
63.47ms/run, 1024 runs, sum 1.0min=1183t exodecr hg 738:52b7cc7558ca ulukaie2.log
62.67ms/run, 1024 runs, sum 1.0min=1168t exodecr hg 739:f226d78afe82 ulukaie2.log
63.31ms/run, 1024 runs, sum 1.0min=1180t exodecr hg 740:7bb770fe7f0b ulukaie2.log
62.93ms/run, 1024 runs, sum 1.0min=1173t exodecr hg 741:34ca1ac53dcc ulukaie2.log
63.63ms/run, 1024 runs, sum 1.0min=1186t exodecr hg 742:6e4cc88b66c3 ulukaie2.log
62.88ms/run, 1024 runs, sum 1.0min=1172t exodecr hg 743:f9bef4cef3da ulukaie2.log
63.36ms/run, 1024 runs, sum 1.0min=1181t exodecr hg 744:e35724a69a10 ulukaie2.log
62.56ms/run, 1024 runs, sum 1.0min=1166t exodecr hg 745:7ed4ac91ecb9 ulukaie2.log
62.34ms/run, 1024 runs, sum 1.0min=1162t exodecr hg 746:3bd8b9361b1c ulukaie2.log
63.85ms/run, 1024 runs, sum 1.0min=1190t exodecr hg 747:d22684dc82b9 ulukaie2.log
And in order of performance:
$ perl -ne '/128 runs/ and next; s/([\r\n]*)$/ $ARGV$1/; print' ulukaie2.log | LC_ALL=C sort
62.34ms/run, 1024 runs, sum 1.0min=1162t exodecr hg 746:3bd8b9361b1c ulukaie2.log
62.56ms/run, 1024 runs, sum 1.0min=1166t exodecr hg 745:7ed4ac91ecb9 ulukaie2.log
62.67ms/run, 1024 runs, sum 1.0min=1168t exodecr hg 739:f226d78afe82 ulukaie2.log
62.88ms/run, 1024 runs, sum 1.0min=1172t exodecr hg 743:f9bef4cef3da ulukaie2.log
62.93ms/run, 1024 runs, sum 1.0min=1173t exodecr hg 741:34ca1ac53dcc ulukaie2.log
63.31ms/run, 1024 runs, sum 1.0min=1180t exodecr hg 740:7bb770fe7f0b ulukaie2.log
63.36ms/run, 1024 runs, sum 1.0min=1181t exodecr hg 744:e35724a69a10 ulukaie2.log
63.47ms/run, 1024 runs, sum 1.0min=1183t exodecr hg 738:52b7cc7558ca ulukaie2.log
63.63ms/run, 1024 runs, sum 1.0min=1186t exodecr hg 742:6e4cc88b66c3 ulukaie2.log
63.85ms/run, 1024 runs, sum 1.0min=1190t exodecr hg 747:d22684dc82b9 ulukaie2.log
64.38ms/run, 1024 runs, sum 1.0min=1200t exodecr hg 735:dcd50f6e0f70 ulukaie2.log
65.03ms/run, 1024 runs, sum 1.1min=1212t exodecr hg 734:06e77fbda68e ulukaie2.log
65.19ms/run, 1024 runs, sum 1.1min=1215t exodecr hg 736:dc7c7640560a ulukaie2.log
65.30ms/run, 1024 runs, sum 1.1min=1217t exodecr hg 733:ab62390369ad ulukaie2.log
65.56ms/run, 1024 runs, sum 1.1min=1222t exodecr hg 732:2789b7b231f5 ulukaie2.log
66.74ms/run, 1024 runs, sum 1.1min=1244t exodecr hg 737:0e19481bfe4c ulukaie2.log
Files and commands used
All files are available on the server in https://pushbx.org/ecm/test/20260726/
The following scriptlet was used to generate the individual binaries: ldebug/source$ export INICOMP_PREFER_INCLUDE_DIR=~/proj/inicomp.old/; DOSEMU=~/local.new/bin/dosemu INICOMP_METHOD='exodecr' INICOMP_SPEED_TEST=16 use_build_decomp_scan=1 build_inicomp_options="$(printf ' %q' "-D_APPEND_NAME=' hg $(hg -R "$INICOMP_PREFER_INCLUDE_DIR" id -n):$(hg -R "$INICOMP_PREFER_INCLUDE_DIR" id -i)'")" use_build_compress_only=1 use_build_double_compressed=0 use_build_inicomp_only=1 ./makerd; beep; LC_ALL=C sort ../tmp/ddebug.spd; LC_ALL=C sort ../tmp/ddebug.siz; cp -ia ../tmp/exo/tddebug.com ~/test/20260726/"tdexo$(hg -R "$INICOMP_PREFER_INCLUDE_DIR" id -n)".com; unset INICOMP_PREFER_INCLUDE_DIR
The contents of the batch file used are:
$ cat testexo.bat @echo off set FILE=%1 set RUNS=%2 if X%FILE%==X set FILE=test if X%RUNS%==X set RUNS=128 tdexo732.com b %RUNS% t l=%FILE%.log tdexo733.com b %RUNS% t l=%FILE%.log tdexo734.com b %RUNS% t l=%FILE%.log tdexo735.com b %RUNS% t l=%FILE%.log tdexo736.com b %RUNS% t l=%FILE%.log tdexo737.com b %RUNS% t l=%FILE%.log tdexo738.com b %RUNS% t l=%FILE%.log tdexo739.com b %RUNS% t l=%FILE%.log tdexo740.com b %RUNS% t l=%FILE%.log tdexo741.com b %RUNS% t l=%FILE%.log tdexo742.com b %RUNS% t l=%FILE%.log tdexo743.com b %RUNS% t l=%FILE%.log tdexo744.com b %RUNS% t l=%FILE%.log tdexo745.com b %RUNS% t l=%FILE%.log tdexo746.com b %RUNS% t l=%FILE%.log tdexo747.com b %RUNS% t l=%FILE%.log

Discussion
Note that revision 736 and 737 result in the same code, only the identifier differs between these files:
So the following result pairs are from the same code each:
34.82ms/run, 1024 runs, sum 35.6s=649t exodecr hg 736:dc7c7640560a a10kvme2.log 35.25ms/run, 1024 runs, sum 36.0s=657t exodecr hg 737:0e19481bfe4c a10kvme2.logA .43ms difference.
30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 736:dc7c7640560a 686msw98.log 30.74ms/run, 1024 runs, sum 31.4s=573t exodecr hg 737:0e19481bfe4c 686msw98.logExact match.
31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 736:dc7c7640560a 686rmch2.log 31.71ms/run, 1024 runs, sum 32.4s=591t exodecr hg 737:0e19481bfe4c 686rmch2.logExact match.
65.19ms/run, 1024 runs, sum 1.1min=1215t exodecr hg 736:dc7c7640560a ulukaie2.log 66.74ms/run, 1024 runs, sum 1.1min=1244t exodecr hg 737:0e19481bfe4c ulukaie2.logA 1.55ms difference!